结构体共用体和枚举类型_第1页
结构体共用体和枚举类型_第2页
结构体共用体和枚举类型_第3页
结构体共用体和枚举类型_第4页
结构体共用体和枚举类型_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

结构体共用体和枚举类型第1页,课件共35页,创作于2023年2月作业分另用结构体和位域两种方法存储学生的身高、体重和成绩等信息,并以总和为依据进行排序第2页,课件共35页,创作于2023年2月第9章结构体、共用体和枚举类型9.1结构体的定义及应用9.2位域*9.3共用体的定义及应用9.4枚举类型第3页,课件共35页,创作于2023年2月9.1结构体的定义及应用设每个学生的数据包括:姓名:字符型数组年龄:无符号整型成绩:单精度浮点类型如何存放10位学生的原始数据?解:定义3个数组分别存放10位学生的姓名、年龄和成绩,用数组下标区别不同的学生:charname[10][20];//存放10位学生的姓名intage[10];//年龄floatscore[10];//成绩用name[i]、age[i]和score[i]表示第i个学生数据。第4页,课件共35页,创作于2023年2月不足:变量多、未直接反映同一学生数据间的联系。改进:①定义结构体类型,描述同一学生的多个数据:

structstudent{//反映同一学生数据间的联系

charname[20];//姓名

intage;//年龄

floatscore;//成绩

};②定义student类型的数组,存放10位学生的数据:

students[10];//变量少结构体可将不同类型的数据组织为一个整体。第5页,课件共35页,创作于2023年2月9.1.1结构体类型的定义结构体类型需先定义后使用,其定义格式:

struct结构体类型名{

类型1成员1;

类型2成员2;

……};说明结构体类型名用标识符表示。成员可以是基本类型或导出类型的变量,不能指定存储类型为auto、register、extern,但可指定存储类型为static。定义结构体类型用分号“;”表示结束。结构体类型是一个存储模型,本身不占内存,仅当定义其变量时,系统才按此存储模型为其变量分配相应的内存。第6页,课件共35页,创作于2023年2月9.1.2结构体类型变量的定义定义结构体类型变量的格式为:结构体类型名变量列表;或

struct结构体类型名变量列表;

其中,结构体类型名为已定义的类型;多个变量之间用逗号分隔;后一种格式与C兼容。例如:

students1,s2,s3[10];或

structstudents1,s2,s3[10];第7页,课件共35页,创作于2023年2月student类型变量s1的内存分配图…按student类型的存储模型为其变量s1分配内存。student类型的存储模型所需内存字节数:

sizeof(student)s1变量各成员在内存中的顺序与其类型中成员说明的顺序一致。name占20字节age占4字节score占4字节第8页,课件共35页,创作于2023年2月结构体类型变量定义的其他形式结构体类型变量也可在声明结构体类型的同时定义。例如:

structDate{intyear,month,day;}today,yesterday;再如:

struct{//定义一个无名结构类型

inta;floatb;}x,y;

无名结构体类型不能在该类型定义之外定义其变量。第9页,课件共35页,创作于2023年2月结构体类型变量的初始化结构体变量的初始化:与数组的初始化方式类似,在花括号中,按结构体成员说明的顺序依次列出其值。例如:

students1={"Jenny",20,98};Datetoday={2007,1,2};structComplex{floatreal,image;}c1={2.0f,3.0f},c2;第10页,课件共35页,创作于2023年2月9.1.3结构体类型变量的使用访问结构体变量成员的格式为:结构体变量.成员名其中“.”是成员访问运算符。例如:

today.year

表示访问结构体变量today的成员year。相同结构体类型的变量之间可直接赋值。例如:

structweather{doubletemp,wind;}w1={7.5,3.2},w2=w1;

其中“w2=w1;”等同于:

w2.temp=w1.temp;w2.wind=w1.wind;第11页,课件共35页,创作于2023年2月结构体类型变量不能直接输入/输出,其成员能否直接输入/输出,取决于其成员的类型,若是基本类型或字符数组,则可直接输入/输出。如:

cin>>s1;//错误

cin>>>>s1.age>>s1.score;//正确

cout<<s1;//错误

cout<<<<s1.age<<s1.score;//正确结构体类型变量做函数的形参时,调用函数的实参必须是相同结构体类型的变量。参数的传递方式为值传递,系统将实参的每个成员逐个拷贝给对应的形参成员。结构体类型变量也可做函数的返回值。第12页,课件共35页,创作于2023年2月例9.1编写求两分数之和的函数,并用它求1/8+5/24。

#include<iostream.h>structFraction{intnum,den;//分别为分数的分子和分母

};intgcd(intm,intn)//求m和n的最大公约数

{intt;if(m<n){t=m;m=n;n=t;}while(t=m%n){m=n;n=t;}returnn;}第13页,课件共35页,创作于2023年2月

Fractionadd(Fractionx,Fractiony)//求分数和

{Fractionz;z.num=x.num*y.den+y.num*x.den;//求分子

z.den=x.den*y.den;//求分母

inta=gcd(z.num,z.den);z.num/=a;z.den/=a;//约分化简

returnz;}voidmain(){Fractionx={1,8},y={5,24},z;z=add(x,y);//调用函数求分数之和

cout<<"x+y="<<z.num<<‘/’<<z.den<<endl;}第14页,课件共35页,创作于2023年2月例9.2电视台举办青年歌手大奖赛,请输入每位选手的姓名、编号及演唱得分、综合素质得分、新歌得分(演唱新歌加0.3分),计算每人的总分,然后输出每人的全部信息。

#include<iostream.h>structSinger{//定义结构体类型,描述青年歌手

charname[10];//姓名

charno[8];//编号

floatsingScore,//演唱得分

diaScore,//综合素质得分

newScore;//新歌得分

floatsum;//总分

};constintn=3;//参赛青年歌手人数第15页,课件共35页,创作于2023年2月voidmain(){Singers[n];//定义结构体数组

for(inti=0;i<n;i++){cout<<"输入第"<<i+1<<“位选手的姓名、编号和三项得分:”;cin>>s[i].name>>s[i].no>>s[i].singScore>>s[i].diaScore>>s[i].newScore;s[i].sum=s[i].singScore+s[i].diaScore+s[i].newScore;//求总分

}for(i=0;i<n;i++)cout<<s[i].name<<'\t'<<s[i].no<<'\t'<<s[i].singScore<<'\t'<<s[i].diaScore<<'\t'<<s[i].newScore<<'\t'<<s[i].sum<<endl;}第16页,课件共35页,创作于2023年2月9.2位域*内存浪费现象比比皆是。例如:人的性别只需1个二进制位就可精确表示,但通常用字符型或字符型数组表示。人的年龄只需7个二进制位就可精确表示,但通常用整型变量表示。针对上述情况,如何节约使用内存?位域:结构体中指定了存储位数的成员称为位域。使用位域可解决上述问题。位域类型:含有位域的结构体类型。第17页,课件共35页,创作于2023年2月定义位域类型格式为:

struct位域类型名{

类型名位域名1:二进制位数;//定义位域类型名位域名2:二进制位数;//定义位域

……//定义其它成员

};

其中,位域类型名用标识符表示,类型名只能是整型和字符型,二进制位数必须是大于或等于0的整数。第18页,课件共35页,创作于2023年2月例如:

structdata{unsignedshortflaga:1;//取值0或1unsignedshortflagb:3;//取值0~7unsignedshortflagc:4;//取值0~15shortflagd:4;//取值-8~7}f1;位域类型data的变量f1的内存分配图1514131211109876543210注:同一字中位域的分配方向因系统而异,可能从右到左,也可能从左到右。VC++从右到左。第19页,课件共35页,创作于2023年2月若要跳过几个二进位,可定义无名位域。若无名位域的位数为0,则表示下一位域从新单元开始。如:

structPackedData{unsignedflaga:4;unsigned:2;//跳过2个二进位,预留

unsigned:0;//下一位域从新单元开始

unsignedflagd:7;};

flagd位域从下一个unsigned存储单元开始存储。这样PackedData类型需要2个unsigned存储单元。第20页,课件共35页,创作于2023年2月位域类型变量的定义、初始化和使用位域类型变量的定义、初始化和用法与结构体类型变量相同。例如:

dataf2={0,4,10,-1};f2.flagc=12;注意:位域赋值时,若所赋数值超出位域的表示范围,则取其低位数字。例如:

f2.flagb=10;

因10已超出flagb位域0~7的表示范围,故赋给flagb位域的是10的二进制表示的低三位:

10的二进制为1010

即f2.flagb实际为2。位域变量节省内存,但存取费时。使用时注意权衡。第21页,课件共35页,创作于2023年2月例9.3用位域来存放学生的信息。#include<iostream.h>constintnum=2;structstudent{charname[10];//姓名:非位域成员

unsignedshortsex:1;//性别:位域成员

unsignedshortage:7;//年龄:位域成员

unsignedshortscore:7;//成绩:位域成员};voidmain(){cout<<"sizeof(student)="<<sizeof(student)<<endl;students[num]={{"Tonny",1,19,98},{"Jenny",0,18,85}};for(inti=0;i<num;i++)cout<<s[i].name<<','<<s[i].sex<<','<<s[i].age<<','<<s[i].score<<endl;}第22页,课件共35页,创作于2023年2月9.3共用体的定义及应用有时希望多个变量共用同一块内存,可通过定义共用体类型的变量来实现。共用体类型的定义格式:

union共用体类型名{

数据类型成员名1;

数据类型成员名2;

……};在定义和使用形式上,共用体与结构体相似:由多个成员组成,成员的类型可以不同。在内存分配上,共用体与结构体有本质区别:结构体的每个成员都有自己的独占内存;而共用体的每个成员共用同一块内存。共同体存储区域的大小由占用最大存储区的成员决定。第23页,课件共35页,创作于2023年2月例如:

unionudata{charc;inti;doubled;};共用体类型定义后,即可定义其变量、数组、指针和引用等。例如:

udatau1,//变量u1实际占用8字节内存

u2[10],*p=u2;第24页,课件共35页,创作于2023年2月对共用体变量的操作与结构体变量类似。例如:

u1.c='a';u1.i=25;u1.d=15.2;

注意,当对变量u1的成员i赋值时,覆盖了成员c的值;类似的当对成员d赋值时,又覆盖了成员i的值。同一时刻,只可使用其中的一个成员。共用体可做函数的参数和返回值。第25页,课件共35页,创作于2023年2月应用举例:学生体能测试,男生测100米,女生测跳绳。要求输入学生的体能测试数据并输出。#include<iostream>usingnamespacestd;structstudent{ charsex;//性别:'m'为男生,'f'为女生

union{ floatrun;//百米成绩

intrope;//跳绳成绩

}score;};第26页,课件共35页,创作于2023年2月voidinput(students[],intn){for(inti=0;i<n;i++){ cout<<"输入学生性别:"; cin>>s[i].sex; if(s[i].sex=='m'){ cout<<"输入男生的百米成绩:"; cin>>s[i].score.run; }elseif(s[i].sex=='f'){ cout<<"输入女生跳绳成绩:"; cin>>s[i].score.rope; }elsecout<<"非法数据\n"; }}第27页,课件共35页,创作于2023年2月voidoutput(students[],intn){ for(inti=0;i<n;i++)if(s[i].sex=='m') cout<<"\n男生百米成绩:"<<s[i].score.run;elseif(s[i].sex=='f')cout<<"\n女生跳绳成绩:"<<s[i].score.rope;elsecout<<"\n非法数据\n";}voidmain(void){ constintn=3; students[n]; input(s,n); output(s,n);}第28页,课件共35页,创作于2023年2月9.4枚举类型现实中有些数据只有有限几种取值。例如:交通灯的颜色:红、黄、绿;人的性别:男、女;一个星期:星期一、星期二、…、星期日。如何表达这些数据?用int、char类型。例如,char型变量表示性别,用’m’和’f’分别表示男和女,其它字符则不合法,但编译器无法检查出这类错误。用枚举类型:可更好解决这类问题。第29页,课件共35页,创作于2023年2月枚举类型的定义定义枚举类型的格式为:

enum<枚举类型名>{<枚举量表>};

枚举类型名为标识符,枚举量表由逗号隔开的标识符组成。枚举量表中的标识符称为枚举常量。例如:

enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};定义枚举类型时,每个枚举常量对应一个整数值。若未指定枚举常量的值,则第1个枚举常量为0,第2个枚举常量为1,依次类推。也可给枚举常量指定值。例如:

enumweekday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};此时Sun为7,Mon为1,Tue为2、…、Sat为6,即未指定值的枚举常量,其值为前一枚举常量的值增1。第30页,课件共35页,创作于2023年2月枚举类型变量的定义枚举变量的定义格式:枚举类型名变量名;或

enum枚举类型名变量名;//与C兼容例如:

weekdayworkday,weekend;

枚举变量workday和weekend的值只能是Sun到Sat之一。也可在定义枚举类型时定义枚举变量。例如:

enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}day1,day2;第31页,课件共35页,创作于2023年2月枚举类型变量的使用赋值运算:枚举常量赋给枚举类型变量,或同类型的枚举类型变量之间相互赋值。例如:

day1=Sun;day2=day1;

不能将一个整数直接赋给枚举类型变量。例如:

enumColor{Red,Green,Yellow}c1,c2;c1=Yellow;//正确

c2=1;//错误可用强制类型转换把整数赋给枚举类型变量。例如:

c2=(Color)1;//或c2=Color(1);

其效果等价于:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论