第十三章结构体和枚举类型.ppt

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

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

1、第十三章,结构体和枚举类型,2,回顾2-1,预处理供能是C语言特有的功能,它是对源程序正式编译前由预处理程序完成的,程序员可以在程序中对预处理命令来调用这个功能。 宏定义是用一个宏名来表示一个文本,这个文本可以是常量、变量或表达式,在宏调用中将用该文本替换宏名。 宏定义可以带有参数,宏调用时是以实参替换形参,而不是“值传送”。,3,回顾2-2,为避免替换出错,宏定义中字符串应加括号,字符串中出现的形参两边也应加括号。 文件包含可以用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。 条件编译允许程序只编译程序中满足条件的程序段,因而生成目标代码较短,从而可以减少内存的开销提高程序

2、效率。 使用预处理功能便于程序的修改、预读、移植和调试,也便于实现模块化程序设计。,4,目标,理解结构体和枚举类型的定义 掌握结构体和枚举类型的用法,5,结构简介,存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩),问题:,I. 使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II. 使用多维数组,C 语言不允许一个数组包含多种数据类型,III. 使用结构,C 语言引入了称为结构的数据存储方式,“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。,6,定义结构2-1,struct structurename

3、datatype variable1; datatype variable2; . ;,结构成员,;,结构名,struct,student,int num;,char name20;,char sex;,定义结构,float score;,C 语言中的有效数据类型,成员列表,7,定义结构2-2,struct student int num; char name20; char sex; float score; ;,num,name,sex,student,结构定义并不预留内存,结构定义放置在程序的开始部分,位于头文件声明之后,score,结构定义仅描述了一个结构的形式。如果要在程序里使用结构

4、,需要声明结构变量。,8,声明结构变量,声明结构变量,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 int num; char name20; char sex; float score; student1,s

5、tudent2;,III. 直接声明结构变量,声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。,9,struct date int month; int day; int year; ;,嵌套结构,struct int num; char name20; char sex; struct date birthday; float score; student1,student2;,表示结构变量成员的一般形式是:结构变量名.成员名 例如:student1.num、student2.sex、student1.birthday.month,

6、10,struct student student3=3,“Yao Ming “,M,90.5;,结构变量初始化,3,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。,student3.num,student3.name,student3.sex,90.5,student3.score,11,student1.num=1; student1.name=“Zhang Zi Liang“; student1.sex=M; printf(“请输入成绩:n“); scanf(“%f“,结构变量赋值,1,Zhang Zi Liang,M,用输入语句或

7、赋值语句来给结构变量的各个成员赋值,78,78,student2 = student1;,1,Zhang Zi Liang,M,78,12,问题描述: 根据学员的成绩,输出不及格学员的详细信息。,使用结构示例,#include struct student int num;/学号 char *name;/姓名 char sex;/性别 float score;/成绩 ; void main() static struct student stu1=1,“李亚鹏“,M,61; static struct student stu2=2,“周晶晶“,F,92.5; static struct stu

8、dent stu3=3,“姚光明“,M,59; printf(“不及格学员的名单如下:n“); if(stu1.score=60 ,不及格学员的名单如下:,3 姚光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,13,struct stu *pstu; (*pstu).num 或者: pstu-num,结构指针变量,一个指针当用来指向一个结构时, 称之为结构指针变量。 结构指针变量中的值是所指向的结构变量的首地址。 结构指针变量声明的一般形式为: struct 结构名 *结构指针变量名 通过结构指针可以访问该结构变量的成员,一般形式为: (*结构指针变量)

9、.成员名 或者 结构指针变量-成员名,#include struct student int num; char *name; char sex; float score; stu=1,“张宾“,F,55,*pstu; void main() pstu= ,学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 Press any key to continue,14,struct student int num; char* name; char sex; float score; stu30;,结

10、构数组,元素为结构类型的数组称为结构数组。 在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结构数组stu1,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构形式。,15,问题描述: 求学员的总成绩和平均成绩,并统计不及格人数。,结构指针变量,struct 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,“

11、王明“,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.2fn“,sum); ave=sum/5; printf(“平均分:%5.2fn“,ave); printf(“不及格人数为:%dn“,count); ,总分: 345.00 平均分:69.00 不及格人数为:2 Press any key to continue,16,结构作为函数参数,可以将结构作为参数传递给函数,也可以定义返回结构值的函数。

12、结构作为函数参数有三种不同方法: 将结构成员的值传递给函数处理。 将整个结构作为参数值传递给函数。 将结构指针变量做函数的参数。,把结构作为整体来处理,但作用方式和效果不同。,17,结构成员作为函数参数,struct film char name25; /电影名 char director25; /导演 int duration; /片长 ; void display (char *, char *, int *); void main() struct film f1; printf(“nt 请输入电影的详细信息“); printf(“nn 请输入影片名:“); gets(f1.name);

13、 fflush(stdin); printf(“n 请输入导演姓名: “); gets(f1.director); fflush(stdin); printf(“n 请输入电影片长(分钟): “); scanf(“%d“, ,演示:示例4,void display(char *n, char *d, int *m) printf(“nt 电影的详细信息n“); printf(“n 片名: %s“,n); printf(“n 导演: %s“,d); printf(“n 片长: %dn“,*m); ,前两个参数为字符串,所以不使用“&”,18,问题描述: 求已知两个复数的和。 分析: 两个复数a+

14、ib和c+id的和为: x+iy 其中:x=a+c y=b+d,#include struct complex double re;/实部 double im;/虚部 ; struct complex add(struct complex,struct 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); ,整个结构作为参数,演示:示例5,struct complex add(struct co

15、mplex a,struct complex b) struct complex c; c.re=a.re+b.re; c.im=a.im+b.im; return c; ,传递结构时不使用 “&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。,19,结构指针做为参数,问题描述: 求已知两个复数的和。 分析: 两个复数a+ib和c+id的和为: x+iy 其中:x=a+c y=b+d,struct student int num; char *name; char sex; float score; stuN=1,“李芳“,F,45,2,“于红“,F,62.5, 3,“何万山“,

16、M,92.5,4,“程亚丽“,M,87, 5,“王明“,M,58; void ave(struct student *ps); void main() struct student *ps; ps=stu; ave(ps); ,演示:示例6,void ave(struct student *ps) int i,count=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(“不及格人数为:%d

17、n“,count); ,用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。,20,枚举类型,枚举类型的定义和枚举变量的说明: 枚举类型定义的一般形式为: enum 枚举名 枚举值表 ; 在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。,21,枚举变量的说明,例如: 该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。 枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。 设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式: enum wee

18、kday 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;,22,枚举类型变量的赋值和使用,枚举类型在使用中有以下规定: 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。 例如对枚举weekday的元素再作以下赋值: sun=5; mon=2; sun=mon; 都是错误的。 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,

19、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); ,23,只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如: a=sum; b=mon; 是正确的。而: a=0; b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。 如: a=(enum weekday)2; 其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应

20、该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。,24,main() enum body a,b,c,d month31,j; int i; j=a; for(i=1;id) j=a; for(i=1;i=30;i+) switch(monthi) case a:printf(“ %2d %ct“,i,a); break; case b:printf(“ %2d %ct“,i,b); break; case c:printf(“ %2d %ct“,i,c); break; case d:printf(“ %2d %ct“,i,d); break; default:bre

21、ak; printf(“n“); ,25,总结2-1,结构是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。 定义一个结构,需要给出各个成员的类型及名称。 结构定义仅描述了一个结构的形式。要在程序里使用结构,需要声明结构变量。 访问结构成员的操作要用圆点运算符(.),一般形式为:结构变量名.成员名。,26,总结2-2,可以通过指向结构的指针访问结构成员,常用形式为:结构指针变量-成员名。 数组元素的类型为结构的数组称为结构数组。 结构作为函数参数有三种不同的方式:结构成员的值传递给函数参数、整个结构作为参数传递、结构指针变量做函数的参数。 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。,

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

当前位置:首页 > 其他


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