第08章结构体、共用体和枚举类型.ppt

上传人:本田雅阁 文档编号:3417823 上传时间:2019-08-23 格式:PPT 页数:37 大小:220.54KB
返回 下载 相关 举报
第08章结构体、共用体和枚举类型.ppt_第1页
第1页 / 共37页
第08章结构体、共用体和枚举类型.ppt_第2页
第2页 / 共37页
第08章结构体、共用体和枚举类型.ppt_第3页
第3页 / 共37页
第08章结构体、共用体和枚举类型.ppt_第4页
第4页 / 共37页
第08章结构体、共用体和枚举类型.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《第08章结构体、共用体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《第08章结构体、共用体和枚举类型.ppt(37页珍藏版)》请在三一文库上搜索。

1、第8章 结构体、共用体和枚举类型 问题的提出, 二维表格: 学号 姓名 年龄 性别 成绩1 成绩2 平均成绩 1 AA 19 M 80 90 85 2 BB 18 F 78 70 74 3 CC 17 M 81 75 73 4 DD 18 F 80 60 70 5 EE 19 M 76 88 82 ,每行的数据类型不相同,如何表示此二维数据? 如何交换两行值? 能否将一行看成一个整体?,8.1 结构体的定义及应用 概念 行: 对象。列: 属性。用具体属性值描述一个具体对象。 定义一种类型,用于描述一类对象,,struct stud int num; / 学号 char name20; / 姓名

2、 int age; / 年龄 char sex; / 性别 int score; / 成绩 ;,一种新的数据类型,类型标识符为 struct stud 或 stud,构造类型:由基本类型派生出来,如数组、结构体、共用体,8.1.1 结构体类型的定义,一般形式:,struct 结构体名 类型名1 成员变量1; 类型名2 成员变量2; 类型名n 成员变量n; ;,说明: (1)结构体类型是一种构造数据类型, 它与 int, char, float 等系统定义的 基本数据类型具有同等地位, 是由用户自行定义的。,(2)系统在使用用户自定义的数据类型的变量时, 会根据类型为其分配存储空间。,8.1.2

3、 结构体类型变量的定义(三种方法) 1. 在定义结构体类型的 同时 定义变量 struct stud int num; char name20; int age; char sex; int score; stud1, stud2;,2. 在结构体类型已定义 之后 定义变量 struct stud int num; char name20; int age; char sex; int score; ; struct stud stud3, stud4;,占用33字节,3. 缺省结构体名,直接定义 struct int num; char name20; int age; char sex;

4、int score; stud5, stud6;,特点:只能定义一次此种类型的结构体变量, 之后该结构体类型定义就无用了, 除非重新定义结构体类型。, 类型与变量是完全不同的概念。 类型:抽象概念,不可赋值、存贮、运算;系统不分配空间。 变量:具体对象,可赋值、存贮、运算;系统为其分配空间。 应先定义结构类型,再定义该类型的变量。,结构体变量的初始化 struct stud stud1= 1000, “Wu“, 19, M, 80, stud2= 2000, “Li“, 18, F, 80;,8.1.3 结构体变量及其成员的使用 1.引用整体,如整体赋值 struct stud stud3,

5、stud4; stud3 = stud1;,2.引用成员, 对于一个具体的结构体变量来说 stud1.num - 相当于一个整型变量 stud1.name - 字符串 stud1.age - 整型变量 stud1.sex - 字符型变量 stud1.score - 整型变量,3.使用结构体变量的成员,就象使用一个简单变量一样 cin stud3.num ; / 输入 cout stud3.num stud3.name; / 输出 stud3.age = stud2.age + 1; / 数学运算 strcpy(stud3.name, “Cheng“); / 字符串赋值 stud3.sex =

6、F; / 字符赋值,注意:结构体变量不能进行整体输入输出, 只能对其基本类型成员输入输出。,若要整体输入输出,需用到面向对象部分介绍的运算符重载技术。,#include struct complex double real; double image; ; void main(void) complex a=1.0, 2.0, b=1.0, 2.0, c ; cout“a=(“ a.real , a.image “)n“; cout“b=(“ b.real , b.image “)n“; c.real = a.real + b.real; c.image = a.image + b.image

7、; cout“a+b=(“ c.real , c.image “)n“; ,例: 定义复数,实现复数加法 (请记录),结构体类型的变量也可以作为函数的参数及返回值。 改写本例,见下页,输出结果:a=(1,2) b=(1,2) a+b=(2,4),#include struct complex double real; double image; ; complex add(complex a , complex b)/注意:形参及返回值 complex x; x.real = a.real+b.real; x.image = a.image+b.image; return x; void ma

8、in(void) complex a=1.0, 2.0, b=1.0, 2.0, c ; cout“a=(“ a.real , a.image “)n“; cout“b=(“ b.real , b.image “)n“; c=add(a,b); /注意:实参及调用形式 cout“a+b=(“ c.real , c.image “)n“; ,例:定义复数,实现复数加法 (请记录),结构体类型的变量,可以 作为函数的参数和返回值。,8.1.4 结构体数组 1.定义结构体数组 一个班30个学生 stud studs30; / stud 为已定义的结构体类型,含义:30个元素,每个元素都是一个结构体变

9、量 studs0,studs1, studs29,2. 结构体数组的初始化 stud studs30= 1000, “Wu“, 19, M, 80 , 2000, “Li“, 18, F, 90 , 2900, “Cheng“, 18, M, 80 ;,struct stud int num; /* 学号 */ char name20; /* 姓名 */ int age; /* 年龄 */ char sex; /* 性别 */ int score; /* 成绩 */ ;,存储状况,3. 结构体数组元素的引用 (1)整体赋值 stud stud1=, stud3=; stud studs30;

10、studs0 = stud1; studsi = stud3;,(2)对每个元素成员的引用 studs0.name, studs0.age studsi.num, studsi.sex,struct stud int num; char name20; int age; char sex; int score; ; void main(void) stud studs30= 1000, “Wu“, 19, M, 80 , 2000, “Li“, 18, F, 90 , 2900, “Cheng“, 18, M, 80 ; int i, aver = 0; for(i=0; i30; i+) a

11、ver += studsi.score; aver /= 30; cout aver endl; ,例: 求一个班学生的平均成绩,结构体类型数组及数组元素的使用:,与一般数据类型相同,可以作为函数的参数及返回值。,例:8.2 建立一个学生档案的结构体数组,P127 输入并输出学生的数据。,#include struct student int num; char name20; float score; ; student Input( ) /返回结构体变量 student stud; coutstud.numstud.namestud.score; return stud; ,void Ou

12、tput(student stud) /结构体变量做参数 cout “学号为 “stud.numn “姓名为 “stud.namen “成绩为 “stud.scoreendl; void main( ) student studs3; for (int i=0; i3; i+) studsi=Input( ); /返回结构体变量 for(i=0; i3; i+) Output(studsi); /结构体变量做参数 coutendl; ,改写 例8.2 P128,#include struct student int num; char name20; float score; ; void I

13、nput(student /不需要 return 语句,void Output(student ,#include struct student int num; char name20; float score; ; void Input(student studs , int n) /结构体数组做参数,注意形参的写法 for(int i=0; istudsi.score; /输入部分值 double Average(student studs , int n) /注意形参 double av=0; for(int i=0; in; i+) av+=studsi.score; return(

14、av/n); ,结构体类型数组做函数的参数:,void Output(student studs , int n) /注意形参 for(int i=0; in; i+) coutstudsi.numtstudsi.namet studsi.scoreendl; void main( ) student studs4= 101,“Wang”, /初始化部分值 102,“Zhang“, 103,“Cheng“, 104,“Liu“ ; double aver; Input(studs, 4); /结构体数组做参数,注意实参的写法 aver=Average(studs, 4); Output(stu

15、ds, 4); cout“Average=“averendl; ,运算符 sizeof(类型标识/变量名) 求某类变量所占字节数,例 short i ; float x; struct stud stud1; sizeof(short) sizeof(i),结果均为2,sizeof(float) sizeof(x),结果均为4,sizeof(struct stud) sizeof(stud) sizeof(stud1),结果均为33 实际运行输出36(4的倍数),struct stud int num; /* 学号 */ char name20; /* 姓名 */ int age; /* 年龄

16、 */ char sex; /* 性别 */ int score; /* 成绩 */ ;,8.2 共用体的定义及应用 问题的提出:表格 “学生:班级 / 教师:职务”,struct people char name10; int num; char sex; char job; union int class; char position20; category; ;,Class 和 Position 的使用是互斥的,可分成两列, 为节省空间,合并成一列。,8.2.1 共用体类型的定义 union data short i; char c; float f; x, y;,特点:三个成员共享存储

17、单元, 即三个成员起始地址相等。 (部分存储单元共用) 同一时刻,只能有一个成员有效!,图 c 占 1 个字节 i 占 2 个字节 f 占 4 个字节,类型标识符为:union data 或 data,8.2.2 共用体变量的定义和使用,union data short i; char c; float f; x, y; union data x, y; (1)引用整体 x = y; (2)引用成员 x.i = 1 ; x.f = 1.5 ; x.c =A ;,8.2.3 公用数据类型的体特点,(2)每一时刻,只能一个成员起作用。,(1)存储字节 union data x, y; sizeof

18、(union data) = sizeof(x) = sizeof(y) = 4 其长度是其占用字节数 最长的成员 的长度。,(3)结构体和公用体可以互相嵌套。,union data short i; char c; float f; x, y;,(4)作为一种数据类型, 公用体变量也可以作为函数的参数及返回值。,定义共用体的目的有两个:节省空间;特殊效果,比如分别取出一个整数的四个字节。 例8.4分别取出一个整数的四个字节。 #include void main( ) union int i; char c4; a; cout a.i; cout =0; k-) cout(int)a.ckt

19、; / 一个整数的四个字节分别对应 / 字符数组的每个元素 coutendl; ,运行情况如下: 请输入一个整数:511 整数的四个字节中的数分别为:0 0 1 -1,例: #include void main(void) union exam struct int x; int y; in; int a, b; e; e.a = 1; e.b = 2; e.in.x = e.a * e.b; e.in.y = e.a + e.b; cout sizeof(exam); cout e.in.x , e.in.y endl; 问题:变量 e 占有几个字节存储空间? 输出什么?,8 字节 4,8,

20、在函数中定义的变量,先定义的后分配空间。 而结构体内部成员的存储空间分配是按顺序的。,enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; 用户取名 枚举常量,8.3 枚举类型 一、定义枚举类型 有时需将一个变量的取值范围限定在某个集合内 如 一周内天数:周一、周二、周三、周四、周五、周六、周日 三基色:红、绿、兰 可将其定义成枚举类型 枚举 - 将变量的取值范围列举出来,enum basic_color Red, Green, Blue ;,0 1 2 3 4 5 6,类型标识符为:enum weekday 或 weekday,二、定义枚举类型变量

21、 enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; weekday day1, day2 意义:变量 day1, day2 的值只能取上述括号中的值 如:day1 = Sun; day2 = Wed;,三、特点 1.不能对枚举常量赋值 如 Sun=7 ,2.枚举常量有默认值,为 0,1,2,,3.在定义时,可以改变枚举常量的值(通常周日是一周的第七天) enum weekday Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat ; Tue 以后的枚举常量虽然没有显式赋值,但它们已有值了。,4. 不能直接通过键盘输入枚举变

22、量的值, 但可以输出枚举常量和变量的值,实际上输出的是序号。 enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; weekday day1, day2; cin day2; / 此行错 cout Sun t Sat endl; day1 = Tue; cout day1 n;,输出?,0 6 2,P132 例8.6:穷举法,结果有60种情况 #include 此算法较好! enum color red, yellow, blue, white, black ; void Print(color col) switch(col) case red:

23、cout “red“ t; break; case yellow: cout “yellow“ t; break; case blue: cout “blue“ t; break; case white: cout “white“ t; break; case black: cout “black“ t; break; default: break; ,void main( ) color i, j, k; int n=0; /计数器:记录共有几种取法 for(i=red; i=black; i=(color)(int(i)+1) ) for(j=red; j=black; j=(color)

24、(int(j)+1) for(k=red; k=black; k=(color)(int(k)+1) if(i!=j ,讲述几点: 学生问题 调试程序 程序书写风格 结构体编程,结构体对象-成员的输入 本章讲稿共享,(1)输入 a = input( ); (2)输出 output(a); (3)加 c = add(a,b); 对应实部相加,对应虚部相加 (4)减 c = sub(a,b); 对应实部相减,对应虚部相减 (5)乘 c = mul(a,b); c.real = a.real*b.real - a.image*b.image; c.image = a.real*b.image + a

25、.image*b.real; (6)除 c = div(a,b); fm = b.real*b.real + b.image*b.image; c.real = (a.real*b.real + a.image+b.image)/fm; c.image = (a.real*b.real - a.image*b.image)/fm;,struct complex double real; double image; ; complex a , b, c ;,有关复数运算:输入、输出、加、减、乘、除,实验八 第2题 程序总体结构 提示:,struct complex ; complex input

26、( ) complex x; cin x.real x.image; return x; void output(complex x) . void main( ) complex a, b, c; cout“Please input complex number a and b: “; a=input( ); b=input( ); c=add(a,b); cout”c=“; output(c); ,实验八 第3题 程序总体结构 提示:,struct point .; point input(point 提示并输入a、b两点坐标。 求出a、b两点间距离len。 输出a、b两点坐标及其两点间的距离len。 ,实验八 第4题 程序总体结构 提示:,struct student ; void input(student studs , int n)/只输入三门课成绩 . void average(student studs , int n) . void main( ) student studs10= “wang“, 99011 , /初始化姓名、学号 “liu“, 99021 ,; int n; cout n; input(studs, n); average(studs, n); sort(studs, n); output(studs, n); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1