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

上传人:本田雅阁 文档编号:2250629 上传时间:2019-03-11 格式:PPT 页数:33 大小:164.51KB
返回 下载 相关 举报
第09章结构体、共用体和枚举类型.ppt_第1页
第1页 / 共33页
第09章结构体、共用体和枚举类型.ppt_第2页
第2页 / 共33页
第09章结构体、共用体和枚举类型.ppt_第3页
第3页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、第9章 结构体、共用体和枚举类型,9.1 结构体的定义及应用 9.2 位域* 9.3 共用体的定义及应用 9.4 枚举类型,9.1 结构体的定义及应用,设每个学生的数据包括: 姓名:字符型数组 年龄:无符号整型 成绩:单精度浮点类型 如何存放10位学生的原始数据? 解:定义3个数组分别存放10位学生的姓名、年龄和成绩,用数组下标区别不同的学生: char name1020; /存放10位学生的姓名 int age10; / 年龄 float score10; / 成绩 用namei、agei和scorei表示第i个学生数据。,不足:变量多、未直接反映同一学生数据间的联系。 改进: 定义结构体类

2、型,描述同一学生的多个数据: struct student/反映同一学生数据间的联系 char name20; /姓名 int age; /年龄 float score; /成绩 ; 定义student类型的数组,存放10位学生的数据: student s10; /变量少 结构体可将不同类型的数据组织为一个整体。,9.1.1 结构体类型的定义,结构体类型需先定义后使用,其定义格式: struct 结构体类型名 类型1 成员1; 类型2 成员2; ;,说明 结构体类型名用标识符表示。 成员可以是基本类型或导出类型的变量,不能指定存储类型为auto、register、extern,但可指定存储类型

3、为static。 定义结构体类型用分号“;”表示结束。 结构体类型是一个存储模型,本身不占内存,仅当定义其变量时,系统才按此存储模型为其变量分配相应的内存。,9.1.2 结构体类型变量的定义,定义结构体类型变量的格式为: 结构体类型名 变量列表; 或 struct 结构体类型名 变量列表; 其中,结构体类型名为已定义的类型;多个变量之间用逗号分隔;后一种格式与C兼容。 例如: student s1,s2,s310; 或 struct student s1,s2,s310;,student类型变量s1的内存分配图,按student类型的存储模型为其变量s1分配内存。 student类型的存储模型

4、所需内存字节数: sizeof(student) s1变量各成员在内存中的顺序与其类型中成员说明的顺序一致。,name 占20字节,age 占4字节,score 占4字节,结构体类型变量定义的其他形式,结构体类型变量也可在声明结构体类型的同时定义。 例如: struct Date int year,month,day; today,yesterday; 再如: struct /定义一个无名结构类型 int a; float b; x,y; 无名结构体类型不能在该类型定义之外定义其变量。,结构体类型变量的初始化,结构体变量的初始化:与数组的初始化方式类似,在花括号中,按结构体成员说明的顺序依次列

5、出其值。 例如: student s1=“Jenny“,20,98; Date today=2007,1,2; struct Complex float real,image; c1=2.0f,3.0f,c2;,9.1.3 结构体类型变量的使用,访问结构体变量成员的格式为: 结构体变量.成员名 其中“.”是成员访问运算符。例如: today.year 表示访问结构体变量today的成员year。 相同结构体类型的变量之间可直接赋值。例如: struct weather double temp,wind; w1=7.5,3.2,w2=w1; 其中“w2=w1;”等同于: w2.temp=w1.t

6、emp; w2.wind=w1.wind;,结构体类型变量不能直接输入/输出,其成员能否直接输入/输出,取决于其成员的类型,若是基本类型或字符数组,则可直接输入/输出。如: cins1; /错误 cins1.names1.ages1.score; /正确 couts1; /错误 couts1.names1.ages1.score;/正确 结构体类型变量做函数的形参时,调用函数的实参必须是相同结构体类型的变量。参数的传递方式为值传递,系统将实参的每个成员逐个拷贝给对应的形参成员。结构体类型变量也可做函数的返回值。,例9.1 编写求两分数之和的函数,并用它求1/8+5/24。 #include s

7、truct Fraction int num,den; /分别为分数的分子和分母 ; int gcd(int m,int n)/求m和n的最大公约数 int t; if(mn) t=m;m=n;n=t; while(t=m%n) m=n;n=t; return n; ,Fraction add(Fraction x,Fraction y)/求分数和 Fraction z; z.num=x.num*y.den+y.num*x.den;/求分子 z.den=x.den*y.den; /求分母 int a=gcd(z.num,z.den); z.num/=a; z.den/=a; /约分化简 ret

8、urn z; void main() Fraction x=1,8,y=5,24,z; z=add(x,y); /调用函数求分数之和 cout“x+y=“z.num/z.denendl; ,例9.2 电视台举办青年歌手大奖赛,请输入每位选手的姓名、编号及演唱得分、综合素质得分、新歌得分(演唱新歌加0.3分),计算每人的总分,然后输出每人的全部信息。 #include struct Singer/定义结构体类型,描述青年歌手 char name10; /姓名 char no8; /编号 float singScore, /演唱得分 diaScore, /综合素质得分 newScore; /新歌得

9、分 float sum; /总分 ; const int n=3; /参赛青年歌手人数,void main() Singer sn; /定义结构体数组 for(int i=0;isi.namesi.nosi.singScore si.diaScoresi.newScore; si.sum=si.singScore+si.diaScore +si.newScore; /求总分 for(i=0;in;i+) coutsi.nametsi.not si.singScoretsi.diaScoret si.newScoretsi.sumendl; ,9.2 位域*,内存浪费现象比比皆是。例如: 人的性

10、别只需1个二进制位就可精确表示,但通常用字符型或字符型数组表示。 人的年龄只需7个二进制位就可精确表示,但通常用整型变量表示。 针对上述情况,如何节约使用内存? 位域:结构体中指定了存储位数的成员称为位域。使用位域可解决上述问题。 位域类型:含有位域的结构体类型。,定义位域类型,格式为: struct 位域类型名 类型名 位域名1 :二进制位数; /定义位域 类型名 位域名2 :二进制位数; /定义位域 /定义其它成员 ; 其中,位域类型名用标识符表示,类型名只能是整型和字符型,二进制位数必须是大于或等于0的整数。,例如: struct data unsigned short flaga:1;

11、 /取值0或1 unsigned short flagb:3; /取值07 unsigned short flagc:4; /取值015 short flagd:4; /取值-87 f1;,位域类型data的变量f1的内存分配图,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,注:同一字中位域的分配方向因系统而异,可能从右到左,也可能从左到右。VC+从右到左。,若要跳过几个二进位,可定义无名位域。若无名位域的位数为0,则表示下一位域从新单元开始。如: struct PackedData unsigned flaga:4; unsigned:2; /跳过2个二进位,预

12、留 unsigned:0; /下一位域从新单元开始 unsigned flagd:7; ; flagd位域从下一个unsigned存储单元开始存储。这样PackedData类型需要2个unsigned存储单元。,位域类型变量的定义、初始化和使用,位域类型变量的定义、初始化和用法与结构体类型变量相同。例如: data f2=0,4,10,-1; f2.flagc=12; 注意:位域赋值时,若所赋数值超出位域的表示范围,则取其低位数字。例如: f2.flagb=10; 因10已超出flagb位域07的表示范围,故赋给flagb位域的是10的二进制表示的低三位: 10的二进制为 1 0 1 0 即f

13、2.flagb实际为2。 位域变量节省内存,但存取费时。使用时注意权衡。,例9.3 用位域来存放学生的信息。 #include const int num=2; struct student char name10; /姓名:非位域成员 unsigned short sex:1; /性别:位域成员 unsigned short age:7; /年龄:位域成员 unsigned short score:7;/成绩:位域成员 ; void main() cout“sizeof(student)=“sizeof(student)endl; student snum=“Tonny“,1,19,98,“

14、Jenny“,0,18,85; for(int i=0;inum;i+) coutsi.name,si.sex, si.age,si.scoreendl; ,9.3 共用体的定义及应用,有时希望多个变量共用同一块内存,可通过定义共用体类型的变量来实现。 共用体类型的定义格式: union 共用体类型名 数据类型 成员名1; 数据类型 成员名2; ;,在定义和使用形式上,共用体与结构体相似:由多个成员组成,成员的类型可以不同。 在内存分配上,共用体与结构体有本质区别:结构体的每个成员都有自己的独占内存;而共用体的每个成员共用同一块内存。 共同体存储区域的大小由占用最大存储区的成员决定。,例如:

15、union udata char c; int i; double d; ; 共用体类型定义后,即可定义其变量、数组、指针和引用等。例如: udata u1, /变量u1实际占用8字节内存 u210, *p=u2;,对共用体变量的操作与结构体变量类似。例如: u1.c=a; u1.i=25; u1.d=15.2; 注意,当对变量u1的成员i赋值时,覆盖了成员c的值;类似的当对成员d赋值时,又覆盖了成员i的值。同一时刻,只可使用其中的一个成员。 共用体可做函数的参数和返回值。,应用举例:学生体能测试,男生测100米,女生测跳绳。要求输入学生的体能测试数据并输出。 #include using n

16、amespace std; struct student char sex; /性别:m为男生,f为女生 union float run; /百米成绩 int rope; /跳绳成绩 score; ;,void input(student s,int n) for(int i=0;isi.sex; if(si.sex=m) coutsi.score.run; else if(si.sex=f) coutsi.score.rope; else cout“非法数据n“; ,void output(student s,int n) for(int i=0;in;i+) if(si.sex=m) co

17、ut“n男生百米成绩:“si.score.run; else if(si.sex=f) cout“n女生跳绳成绩:“si.score.rope; else cout“n非法数据n“; void main(void) const int n=3; student sn; input(s,n); output(s,n); ,9.4 枚举类型,现实中有些数据只有有限几种取值。例如: 交通灯的颜色:红、黄、绿; 人的性别:男、女; 一个星期:星期一、星期二、星期日。 如何表达这些数据? 用int、char类型。例如,char型变量表示性别,用m和f分别表示男和女,其它字符则不合法,但编译器无法检查出这

18、类错误。 用枚举类型:可更好解决这类问题。,枚举类型的定义,定义枚举类型的格式为: enum ; 枚举类型名为标识符,枚举量表由逗号隔开的标识符组成。枚举量表中的标识符称为枚举常量。 例如: enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat; 定义枚举类型时,每个枚举常量对应一个整数值。 若未指定枚举常量的值,则第1个枚举常量为0,第2个枚举常量为1,依次类推。 也可给枚举常量指定值。例如: enum weekdaySun=7,Mon=1,Tue,Wed,Thu,Fri,Sat; 此时Sun为7,Mon为1,Tue为2、Sat为6,即未指定值的枚举常量,其值为前一

19、枚举常量的值增1。,枚举类型变量的定义,枚举变量的定义格式: 枚举类型名 变量名; 或 enum 枚举类型名 变量名; /与C兼容 例如: weekday workday, weekend; 枚举变量workday和weekend的值只能是Sun到Sat之一。 也可在定义枚举类型时定义枚举变量。例如: enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat day1,day2;,枚举类型变量的使用,赋值运算:枚举常量赋给枚举类型变量,或同类型的枚举类型变量之间相互赋值。例如: day1=Sun; day2=day1; 不能将一个整数直接赋给枚举类型变量。例如: enu

20、m ColorRed,Green,Yellowc1,c2; c1=Yellow; /正确 c2=1; /错误 可用强制类型转换把整数赋给枚举类型变量。例如: c2=(Color)1; / 或c2=Color(1); 其效果等价于: c2=Green;,枚举类型变量的使用,关系运算:枚举值进行比较时,比较的是它们对应的整型值的大小。例如c1c2的运算结果为true。 输出:直接输出枚举变量时,输出的是枚举变量对应的整数。如需输出对应的字符串,必须通过代码进行转换。 输入:不能直接输入枚举类型变量的值,例如: cinday1; /错误 对于枚举值的输入,通常通过输入一个整型值,然后把该整型值转换成

21、一个枚举值。,例9.4 输入/输出枚举类型的值。 #include enum Major chinese,math,physics,computer ; void main() Major m; int n; coutn; switch(n) case 0: m=chinese;break;,case 1: m=math;break; case 2: m=physics;break; case 3: m=computer;break; default: cout“Input error!n“; return; switch(m) case chinese: cout“Chinesen“; break; case math: cout“mathn“; break; case physics: cout“phsicsn“; break; case computer: cout“computern“; break; ,

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

当前位置:首页 > 其他


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