《第十三章结构体和枚举类型》由会员分享,可在线阅读,更多相关《第十三章结构体和枚举类型(26页珍藏版)》请在金锄头文库上搜索。
1、第十三章第十三章结构体和枚举类型回顾2-1q预处理供能是C语言特有的功能,它是对源程序正式编译前由预处理程序完成的,程序员可以在程序中对预处理命令来调用这个功能。q宏定义是用一个宏名来表示一个文本,这个文本可以是常量、变量或表达式,在宏调用中将用该文本替换宏名。q宏定义可以带有参数,宏调用时是以实参替换形参,而不是“值传送”。2回顾2-2q为避免替换出错,宏定义中字符串应加括号,字符串中出现的形参两边也应加括号。q文件包含可以用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。q条件编译允许程序只编译程序中满足条件的程序段,因而生成目标代码较短,从而可以减少内存的开销提高程序效率
2、。q使用预处理功能便于程序的修改、预读、移植和调试,也便于实现模块化程序设计。3目标q理解结构体和枚举类型的定义q掌握结构体和枚举类型的用法4结构简介存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩)问题:I. 使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II. 使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C 语言不允许一个数组包含多种数据类型III. 使用结构numnamesexscoreC 语
3、言引入了称为结构的数据存储方式“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。5 定义结构2-1struct structurenamedatatype variable1;datatype variable2;.;结构成员;结构名structstudentint num;char name20;char sex;定义结构float score;C 语言中的有效数据类型成员列表6定义结构2-2struct student int num; char name20; char sex; float score;num name sexstudent
4、结构定义并不预留内存结构定义放置在程序的开始部分,位于头文件声明之后 score结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。7声明结构变量声明结构变量struct student int num; char name20; char sex; float score;struct student student1,student2;I.先定义结构,再声明结构变量struct student int num; char name20; char sex; float score;student1,student2;II.在定义结构类型的同时声明结构变量struct
5、int num; char name20; char sex; float score;student1,student2;III. 直接声明结构变量声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。 8struct date int month; int day; int year;嵌套结构struct int num; char name20; char sex; struct date birthday; float score;student1,student2;表示结构变量成员的一般形式是:结构变量名.成员名例如:studen
6、t1.num、student2.sex、student1.birthday.month9内存student3struct student student3=3,Yao Ming ,M,90.5; 结构变量初始化3Yao MingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student3.numstudent3.namestudent3.sex90.5student3.score10student1student1.num=1;student1.name=Zhang Zi Liang;student1.sex=M;printf(请输入成绩:请输入成绩:n)
7、;scanf(%f,&student1.score);结构变量赋值1Zhang Zi Liang Mq用输入语句或赋值语句来给结构变量的各个成员赋值7878student2 = student1; student21Zhang Zi Liang M7811问题描述:根据学员的成绩,输出不及格学员的详细信息。 使用结构示例#includestruct studentint num;/学号char *name;/姓名char sex;/性别float score;/成绩;void main() static struct student stu1=1,李亚鹏,M,61; static struct
8、 student stu2=2,周晶晶,F,92.5; static struct student stu3=3,姚光明,M,59; printf(不及格学员的名单如下:n); if(stu1.score60) printf(%dt%st%ct%5.2fn,stu1.num,stu1.name,stu1.sex,stu1.score); if(stu2.score60) printf(%dt%st%ct%5.2fn,stu2.num,stu2.name,stu2.sex,stu2.score); if(stu3.score=60 & stu2.score=60 & stu3.score=60)
9、 printf(没有不及格的学员。n);不及格学员的名单如下:3 姚光明 M 59.00stu11李亚鹏M78stu22周晶晶F92stu33姚光明M5912struct stu *pstu;(*pstu).num 或者: pstu-num结构指针变量q一个指针当用来指向一个结构时, 称之为结构指针变量。q结构指针变量中的值是所指向的结构变量的首地址。q结构指针变量声明的一般形式为: struct 结构名 *结构指针变量名q通过结构指针可以访问该结构变量的成员,一般形式为: (*结构指针变量).成员名 或者 结构指针变量-成员名 #includestruct studentint num;ch
10、ar *name;char sex;float score;stu=1,张宾,F,55,*pstu;void main() pstu=&stu; printf(学号:%d 姓名:%sn,stu.num,stu.name); printf(性别:%c 成绩:%5.2fnn,stu.sex,stu.score); printf(学号:%d 姓名:%sn,(*pstu).num,(*pstu).name); printf(性别:%c 成绩:%5.2fnn,(*pstu).sex,(*pstu).score); printf(学号:%d 姓名:%sn,pstu-num,pstu-name); prin
11、tf(“性别:%c 成绩:%5.2fnn,pstu-sex,pstu-score);学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00Press any key to continue13struct student int num; char* name; char sex; float score;stu30;结构数组q元素为结构类型的数组称为结构数组。q在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构数组stu1,共有30个元素,
12、stu0stu29。每个数组元素都具有struct student的结构形式。14问题描述:求学员的总成绩和平均成绩,并统计不及格人数。 结构指针变量struct studentint num;char *name;char sex;float score;stuN= 1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;void main()int i,count=0; float ave,sum=0;for(i=0;iN;i+) sum+=stui.score;if(stui.score60)count+;printf(总分:%7.
13、2fn,sum);ave=sum/5;printf(平均分:%5.2fn,ave);printf(不及格人数为:%dn,count);总分: 345.00平均分:69.00不及格人数为:2Press any key to continue15结构作为函数参数q可以将结构作为参数传递给函数,也可以定义返回结构值的函数。q结构作为函数参数有三种不同方法:q将结构成员的值传递给函数处理。q将整个结构作为参数值传递给函数。q将结构指针变量做函数的参数。把结构作为整体来处理,但作用方式和效果不同。16结构成员作为函数参数struct film char name25; /电影名 char directo
14、r25; /导演 int duration; /片长;void display (char *, char *, int *);void main() struct film f1; printf(nt 请输入电影的详细信息); printf(nn 请输入影片名:); gets(f1.name); fflush(stdin); printf(n 请输入导演姓名: ); gets(f1.director); fflush(stdin); printf(n 请输入电影片长(分钟): ); scanf(%d,&f1.duration); display(f1.name,f1.director,&f1
15、.duration);演示:示例4void display(char *n, char *d, int *m)printf(nt 电影的详细信息n);printf(n 片名: %s,n);printf(n 导演: %s,d);printf(n 片长: %dn,*m);前两个参数为字符串,所以不使用“&”17问题描述: 求已知两个复数的和。分析: 两个复数a+ib和c+id的和为: x+iy 其中:x=a+c y=b+d#includestruct complex double re;/实部 double im;/虚部;struct complex add(struct complex,stru
16、ct complex);void main() struct complex x=6.5,8.9,y=7.1,9.4; struct complex z; z=add(x,y); printf(和为:%5.2lf+i%5.2lfn,z.re,z.im);整个结构作为参数 演示:示例5struct complex add(struct complex a,struct complex b)struct complex c;c.re=a.re+b.re;c.im=a.im+b.im;return c;传递结构时不使用 “&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。18结构指针做
17、为参数 问题描述: 求已知两个复数的和。分析: 两个复数a+ib和c+id的和为: x+iy 其中:x=a+c y=b+dstruct student int num; char *name; char sex; float score;stuN=1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;void ave(struct student *ps);void main() struct student *ps; ps=stu; ave(ps);演示:示例6void ave(struct student *ps) int i,co
18、unt=0; float ave,sum=0; for(i=0;iscore; if(ps-score60) count+; printf(总分:%7.2fn,sum); ave=sum/5; printf(平均分:%5.2fn,ave); printf(不及格人数为:%dn,count);用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。19枚举类型枚举类型枚举类型的定义和枚举变量的说明: 枚举类型定义的一般形式为: enum 枚举名 枚举值表 ;在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。20枚举变量的说明例如: 该枚举名为weekday,枚举值共有7个,即一周中的七
19、天。凡被说明为weekday类型变量的取值只能是七天中的某一天。枚举变量的说明如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:enum weekday sun,mou,tue,wed,thu,fri,sat ;enum weekday a,b,c;或者为:enum weekday sun,mou,tue,wed,thu,fri,sat a,b,c;或者为:enum sun,mou,tue,wed,thu,fri,sat a,b,c;21枚举类型变量的赋值和使用枚举类型变量的赋值和使用
20、q枚举类型在使用中有以下规定:枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。 例如对枚举weekday的元素再作以下赋值: sun=5; mon=2; sun=mon; 都是错误的。枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2。如在weekday中,sun值为0,mon值为1,,sat值为6。main() enum weekday sun,mon,tue,wed,thu,fri,sat a,b,c; a=sun; b=mon; c=tue; printf(%d,%d,%d,a,b,c);22只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
21、 a=sum;b=mon;是正确的。而: a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue;还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。23main() enum body a,b,c,d month31,j; int i; j=a; for(i=1;id) j=a; for(i=1;i成员名。q数组元素的类型为结构的数组称为结构数组。q结构作为函数参数有三种不同的方式:结构成员的值传递给函数参数、整个结构作为参数传递、结构指针变量做函数的参数。 q枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。26