《C语言课件 第9章》由会员分享,可在线阅读,更多相关《C语言课件 第9章(98页珍藏版)》请在金锄头文库上搜索。
1、第 9章 结构体类型与共用体类型 第第 9章章 结构体类型与共用体类型结构体类型与共用体类型 9.1 结构体类型结构体类型 9.2 结构体数组结构体数组 9.3 共用体类型共用体类型 9.4 枚举类型枚举类型 9.5 程序设计举例程序设计举例 习习 题题 九九第 9章 结构体类型与共用体类型 9.1 结构体类型结构体类型 9.1.1 结构体类型的定义结构体类型的定义 结构体类型定义用关键字struct标识, 形式为: struct 标识符 成员表; 第 9章 结构体类型与共用体类型 例如, 定义结构体类型, 描述下列数据。 (1) 学生情况, 包含学生的学号、 姓名、 性别、 年龄、C语言课程
2、成绩: struct studentint no; /*学号*/ char name8; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float cscore; /*C成绩*/; 第 9章 结构体类型与共用体类型 如考虑30门课程成绩, 加上总成绩与平均成绩,可作如下定义: struct studentint no; /*学号*/ char name8; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score31; /*30门课程成绩*/ float tcj, acj; /*总成绩, 平均成绩*/; 第 9章
3、结构体类型与共用体类型 (2) 个人数据,包含姓名、性别、年龄、身高、体重、住址: struct personchar name8; /*姓名*/char sex; /*性别*/int age; /*年龄*/float height; /*身高*/float weight; /*体重*/char add40; /*住址*/; 第 9章 结构体类型与共用体类型 (3) 平面上的点: struct point2float x; /*横坐标*/float y; /*纵坐标*/;如考虑空间中的点, 可作如下定义:struct point3float x; /*X坐标*/float y; /*Y坐标*/
4、float z; /*Z坐标*/; 第 9章 结构体类型与共用体类型 (4) 日期, 包括年、 月、 日:struct dateint year; /*年*/month; /*月*/day; /*日*/;如考虑时间, 可作如下定义: struct timeint hh; /*时*/int mm; /*分*/int ss; /*秒*/; 第 9章 结构体类型与共用体类型 (5) 复数:struct complexfloat re; /*实部*/ float ie; /*虚部*/; 第 9章 结构体类型与共用体类型 (6) 三角形: struct sjx float a, b, c; /*三边*/
5、; 第 9章 结构体类型与共用体类型 9.1.2 结构体变量的定义结构体变量的定义定义结构体变量有三种方法。(1) 先定义结构体类型,再定义结构体变量。形式为:struct 标识符成员表;或定义为: struct 标识符 变量表;第 9章 结构体类型与共用体类型 例如,对以上定义的结构体类型,我们可以定义如下一些结构体变量: struct student zhang; /*张同学情况*/ struct person p100; /*100个人的数据*/ struct point2 p1, p2; /*平面上的两个点*/ struct point3 po1, po2; /*空间上的两个点*/ 第
6、 9章 结构体类型与共用体类型 (2) 定义结构体类型的同时定义结构体变量。 形式为: struct 标识符 成员表 变量表; 例如, 对以上定义的结构体变量,我们可以在定义结构体类型的同时定义如下: struct student int no; char name8; char sex; int age; float cscore; zhang; /*张同学情况*/ 第 9章 结构体类型与共用体类型 struct personchar name8; char sex; int age; float height; float weight; char add40; p100; /*100个人
7、的数据*/ 第 9章 结构体类型与共用体类型 struct point2 float x; float y; p1, p2; /*平面上的两个点*/struct point3 float x; float y; float z; po1, po2; /*空间上的两个点*/ 第 9章 结构体类型与共用体类型 struct dateint year;/*年*/ int month;/*月*/ int day;/*日*/ date;/*某年某月某日*/第 9章 结构体类型与共用体类型 (3) 直接定义结构体变量。 形式为: struct 成员表 变量表; 直接定义结构体变量, 在关键字struct后
8、无标识符,不出现结构体名, 仅给出成员表及变量表。 例如,对以上定义的结构体变量, 我们可以直接定义如下: 第 9章 结构体类型与共用体类型 struct int no; char name8; char sex; int age; float cscore; zhang; /*张同学情况*/ 第 9章 结构体类型与共用体类型 structchar name8; char sex; int age; float height; float weight; char add40; p100; /*100个人的数据*/ 第 9章 结构体类型与共用体类型 structfloat x; float y
9、; p1, p2; /*平面上的两个点*/struct float x; float y; float z; po1, po2; /*空间上的两个点*/ 第 9章 结构体类型与共用体类型 struct int year;/*年*/int month;/*月*/day;/*日*/ date;/*某年某月某日*/第 9章 结构体类型与共用体类型 如果重命名了结构体类型, 则可以用新类型名来定义结构体变量。 例如: typedef structchar name8; char sex; int age; float height; float weight; char add40; persont;
10、 /*将结构体类型命名为persont*/persont p100; /*100个人的数据*/ 第 9章 结构体类型与共用体类型 9.1.3 结构体变量的引用结构体变量的引用 结构体的分量称为字段变量。字段变量通过结构体变量名、 成员名(字段名)与点运算来描述。 字段变量的形式为:结构体变量名.成员名 例如: (1) struct student类型变量zhang, 其所有分量如下: zhang.no, zhang.name, zhang.sex, zhang.age, zhang.cscore (2) struct point2类型变量p1, 其所有分量如下: p1.x, p1.y (3)
11、struct point2类型变量p2, 其所有分量如下: p2.x, p2.y 第 9章 结构体类型与共用体类型 说明: (1) 字段变量相当于相应成员类型的变量,它存取相应类型数据,并进行相应类型数据的运算操作。例如,上面例子中的zhang.no相当于整型变量,zhang.name相当于字符数组型变量,zhang.sex相当于字符型变量,zhang.age、zhang.cscore 相当于整型变量,p1.x、p1.y相当于实型变量。 (2) 对有的分量,其类型本身又是复杂类型,可进一步表示其相应分量。例如,zhang.name是一字符数组,其相应分量是zhang.name0、zhang.n
12、ame7。 (3) 通过地址运算符可引用结构体变量的成员地址,也可以引用结构体变量的地址。结构体变量的地址主要用作函数的参数。 (4) 在新标准C语言中,赋值运算可以整体引用结构体变量,相同类型结构体变量之间可以进行整体赋值。第 9章 结构体类型与共用体类型 9.1.4 结构体变量的初始化结构体变量的初始化 初始化格式: 存储类别 struct 结构体名成员表 结构体变量=初始化数据表; 初始化数据表是相应成员的初值表。 第 9章 结构体类型与共用体类型 例如: (1) extern struct student int no; char name8; int age; float cscor
13、e; zhang=9901,zhangsan,m,19,95; 即zhang.no初值为9901,zhang.name初值为zhangsan,zhang.sex初值为m,zhang.age初值为19,zhang.cscore初值为95。第 9章 结构体类型与共用体类型 (2) static struct point2float x; float y; p1=2.5, 19.8;即p1.x初值为2.5,p1.y初值为19.8。第 9章 结构体类型与共用体类型 例例9-1 求某同学上学期八门课程的总成绩与平均成绩。 算法提示: (1) 八门课程的成绩、总成绩与平均成绩都是某同学的,我们用结构体来描
14、述。 (2) 整体操作可转化成对各分量进行。第 9章 结构体类型与共用体类型 程序如下:/*程序9 - 1, 求某同学的总成绩与平均成绩*/main( )struct st char xm8; float cj9; float tcj, acj; stu; /*定义结构体量stu*/int i;scanf(%s, stu.xm); /*输入*/ 第 9章 结构体类型与共用体类型 for(i=1; i=8;i+) scan(%f, &stu.cji); stu.tcj=0.0; /*求总成绩*/for(i=1; i=8;i+) stu.tcj+=stu.cji; stu.acj=stu.tcji
15、/8; /*求平均成绩*/printf(%s的总成绩=%6.2f, 平均成绩=%6.2f,stu.tcj, stu.acj); /*输出*/ 输入数据: CHEN 80 86 79 98 88 72 96 66运行结果: CHEN的总成绩=577.00, 平均成绩= 72.13 第 9章 结构体类型与共用体类型 例例9-2 求平面上两点之间的距离。算法提示:(1) 点用结构体描述。(2) 整体操作转化成对各分量进行。第 9章 结构体类型与共用体类型 /*程序9 - 2, 求平面上两点之间的距离*/main( )struct pointfloat x; float y; p1, p2; floa
16、t d; printf(请输入第一点的坐标: ); scanf(%f, %f, &p1.x, &p1.y); printf(请输入第二点的坐标: ); scanf(%f, %f, &p2.x, &p2.y); d=sqrt(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y); printf(两点之间的距离=%8.3f, d); 第 9章 结构体类型与共用体类型 运行结果: 请输入第一点的坐标: 1, 1请输入第二点的坐标: 3, 3两点之间的距离=2.828 第 9章 结构体类型与共用体类型 /*程序9 - 3, 复数的加减运算 */main( )st
17、ruct complexfloat re; float ie; x, y; /*输入变量*/struct complex s1, s2; /*输出变量*/printf(请输入第一个复数的实部, 虚部: ); scanf(%f, %f, &x.re, &x.ie); 例例9-3 复数的加减运算。算法提示:(1) 复数用结构体描述。(2) 整体操作转化成对各分量进行。第 9章 结构体类型与共用体类型 printf(请输入第二个复数实部, 虚部: ); scanf(%f, %f, &y.re, &y.ie); s1.re=x.re+y.re; /*求和*/s1.ie=x.ie+y.ie; s2.re
18、=x.re-y.re; /*求差*/s2.ie=x.ie-y.ie; printf(所求复数的和=%8.3f+%8.3f i n, s1.re , s1.ie); printf(所求复数的差=%8.3f+%8.3f i n, s2.re , s2.ie); 第 9章 结构体类型与共用体类型 运行结果:运行结果: 请输入第一个复数的实部, 虚部: 3.2, 4.3请输入第二个复数实部, 虚部: 2.1, 3.1所求复数的和= 5.3+ 7.5 i所求复数的差= 1.1+ 1.2 i 第 9章 结构体类型与共用体类型 9.1.5 结构体作函数参数结构体作函数参数 例例 9 4 将例9 - 2中求平
19、面上两点之间的距离改用函数实现。 struct pointfloat x; float y; ; float p1p2(p1, p2)/*求平面上两点之间距离的函数*/struct point p1, p2; float d; d=sqrt(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y); return(d); 第 9章 结构体类型与共用体类型 例例 9 5 将例9 - 3中复数的加减运算改用函数实现。 /*程序9 - 5, 采用函数实现复数的加减运算 */struct complexfloat re; float ie; ; main( )str
20、uct complex x, y; struct complex s1, s2; struct complex csum( ); /*调用函数申明*/ struct complex csub( ); printf(请输入第一个复数的实部, 虚部: ); scanf(%f, %f, &x.re, &x.ie); printf(请输入第二个复数实部, 虚部: ); scanf(%f, %f, &y.re, &y.ie); s1=csum(x, y); /*调用函数求和*/ s2=csub(x, y); /*调用函数求差*/第 9章 结构体类型与共用体类型 printf(所求复数的和=%8.3f+%
21、8.3f i n, s1.re , s1.ie); printf(所求复数的差=%8.3f+%8.3f i n, s2.re , s2.ie); struct complex csum(xx, xy)/*求两个复数和的函数*/struct complex xx, xy; struct complex t; t.re=xx.re+xy.re; t.ie=xx.ie+xy.ie; return(t); struct complex csub(xx, xy)/*求两个复数差的函数*/struct complex xx, xy; struct complex t; t.re=xx.re-xy.re;
22、t.ie=xx.ie-+xy.ie; return(t); 第 9章 结构体类型与共用体类型 9.1.6 嵌套结构体嵌套结构体 例如,在描述个人数据时, 假如除了年龄,还需描述出生日期。 我们需在前面的定义中增加一日期结构体成员,形成嵌套结构体类型person。 struct dateint year; month; day; ; struct personchar name8; char sex; int age; struct date birthday; /*增加的结构体成员*/ float height; float weight; char add40; ; 第 9章 结构体类型与共
23、用体类型 我们也可采用如下的嵌套结构体形式: struct personchar name8; char sex; int age; struct dateint year; month; day; birthday; /*增加的结构体成员*/ float height; float weight; char add40; ; 第 9章 结构体类型与共用体类型 对于嵌套结构体,其最终成员需用多级点运算完成描述,其它处理同前所述。 例如:struct person zhou; 出生年份为zhou.birthday.year,出生月份为zhou.birthday.month,出生日期为zhou.b
24、irthday.day。 结构体还可以自己嵌套自己,成为递归结构体,这将在第10章10.5节中涉及。第 9章 结构体类型与共用体类型 9.2 结构体数组结构体数组 结构体数组的定义与结构体变量的定义一样有以下三种形式: (1) Struct 标识符 成员表 ; struct 标识符 数组名常量; (2) struct 标识符 成员表 数组名常量; (3) struct 成员表 数组名常量; 第 9章 结构体类型与共用体类型 例如,100个同学的情况, 我们可以定义结构体数组allst描述: struct studentint no; char name8; char sex; int age;
25、 float score31; float tcj, acj; allst100; 第 9章 结构体类型与共用体类型 对结构体数组allst的操作要转化成对allsti进行操作,而allsti的操作要转化成对allsti.no、allsti.name、allst i .sex、 allst i .age、 allst i .score、allsti.tcj、allsti.acj进行操作。allsti.no、allst i .name、 allst i .sex、 allst i .age、allsti.score、allsti.tcj、allsti.acj相当于对应基类型的量。 第 9章 结构
26、体类型与共用体类型 例例 9 6 用结构体数组处理全班50个同学的C语言课程成绩。 /*程序9 - 6, 用结构体数组处理C语言成绩, 排序输出*/define STT struct studentSTTchar xm8; float c; ; main( )STT cs51; /*存放50个同学的姓名、 C成绩*/int i; int flag; STT t; /*排序时用于交换数据*/for(i=1; i 50; i+)/*输入50个同学的姓名、 C成绩*/ 第 9章 结构体类型与共用体类型 scanf(%s%f, &csi.xm, &csi. c); do /*冒泡排序*/ flag=1
27、; for(i=1; i csi. c) t=csi; csi=csi+1; csi+1=t; flag=0; while(!flag); printf(排序后的C语言成绩如下: n); /*输出*/printf( 姓名 分数 名次n); for(i=1; i 50; i+) printf(%8s%6.1f %6dn, csi.xm, csi. c, i); 第 9章 结构体类型与共用体类型 例例 9 - 7 假设有5个候选人,有20人参加投票,规定只能在5个候选人中选一个,多选或选这5人以外者均为废票。 试用结构体数组编写程序,统计出5位候选人各人所得票数。 算法提示: (1) 用结构体描述
28、一位候选人的情况,包括其姓名及所得票数两项。5个候选人的数据用一结构体数组描述,在定义时初始化,即刚开始时得票数均为0。 (2) 20人投票用循环处理。第 9章 结构体类型与共用体类型 程序如下:/*程序9 - 7, 统计候选人得票数*/struct tttchar name12; int count; ; main( )struct ttt dp5=Zhang, 0, Li, 0, Wang, 0, Liu, 0, Zhao, 0; char tp10; int i, j; for(i=1; i=20; i+) 第 9章 结构体类型与共用体类型 scanf (%s, tp); for(j=0
29、; j5; j+) if(strcmp(tp, dpi.name)= =0)dpj.count+; for(i=0; i5; i+) printf(%s的得票数=%dn, dpi.name, dpi.count); 输入数据: Zhang Li Wang Liu Zhao Zhao Li Li Zhang Li Zhang Li Liu Li Zhang Liu Li Li Zhang 运行结果: Zhang的得票数=5Li的得票数=8Wang的得票数=1Liu的得票数=3Zhao的得票数=2 第 9章 结构体类型与共用体类型 9.3 共用体类型共用体类型 9.3.1 共用体类型定义共用体类型
30、定义 共用体类型定义与结构体类型定义类似,只是改用关键字union标识。 其形式为: union 标识符 成员表;第 9章 结构体类型与共用体类型 标识符给出共用体名,是共用体类型名的主体,定义的共用体类型由“union 标识符”标识。例如,定义共用体类型,要求包含一个整型成员、一个字符型成员和一个单精度型成员:union icfint i; char c; float f;第 9章 结构体类型与共用体类型 9.3.2 共用体变量的定义共用体变量的定义 (1) 先定义共用体类型,再定义共用体变量: union 共用体名 成员表; union 共用体名 变量表;(2) 定义共用体类型的同时定义共
31、用体变量: union 共用体名 成员表 变量表;(3) 直接定义共用体变量: union 成员表 变量表;第 9章 结构体类型与共用体类型 9.3.3 共用体变量的引用共用体变量的引用 共用体变量不能直接被使用,只能使用它的某个成员,通过共用体变量名与共用体成员名进行点运算得到。 形式为: 共用体变量名. 共用体成员名 例如: union icf x; 共用体类型变量x占有4个字节的空间,x.i表示其整型成员,x.c表示其字符型成员,x.f表示其单精度型成员。第 9章 结构体类型与共用体类型 说明: (1) 共用体变量中可以包含若干成员及若干种类型,但共用体成员不能同时使用。 在每一时刻,只
32、能引用一个成员。共用体变量中起作用的成员值是最后一次存储的成员值。 (2) 共用体变量所有成员共用同一段内存单元,共用体变量和它的各个成员具有相同的地址。后来存放的共用体成员值将覆盖之前存放的共用体成员值,故只能使用最后一次存储的共用体成员值。第 9章 结构体类型与共用体类型 (3) 不能对共用体变量进行初始化和赋值,也不能通过引用共用体变量名来得到某成员的值。 (4) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型。 (5) 共用体类型和结构体类型可以相互嵌套,共用体中的成员可以为数组,甚至还可以定义为共用体数组。第 9章 结构体类型与共用体类型 例例 9 - 8 设有若干教师的数
33、据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。 程序如下:/*程序9-8,输入/输出教师信息*/union cf char clname30;/*所讲课程*/ int num;/*论文数目*/;struct teachersint no;/*编号*/ char name12;/*姓名*/ char zc;/*职称*/ union cf x;/*可变字段,为所讲课程或论文数目*/第 9章 结构体类型与共用体类型 teach10;/*假设有10位教师*/main( ) int i; for(i=0;i10;i+) /*输入数据*/ sca
34、nf(%d,%s,%c,&teachi.no,teachi.name,&teachi.zc); if ( teachi.zc=L) /*L表示讲师*/ scanf(%s,&teachi.x .clname); else if (teachi.zc=P) /*P表示教授*/ scanf (%d,&teachi.x .num); else printf (input data error!n); 第 9章 结构体类型与共用体类型 printf(编号 姓名 职称 讲授课程或论文数n);/*输出数据*/for(i=0;i10;i+) printf (%12d %12s%6c ,teachi.No,te
35、achi.name,teachi.zc); if (teachi.zc=L)printf (%12sn,teachi.x. clname); else if (teachi.zc=P)printf (%12dn, teachi.x. num); else printf(errorn); 第 9章 结构体类型与共用体类型 9.4 枚举类型枚举类型 9.4.1 枚举类型的定义枚举类型的定义 枚举类型定义用关键字enum标识,形式为: enum 标识符 枚举数据表; 标识符用来区分不同的枚举类型,定义的枚举类型用enum标识符”标识。 第 9章 结构体类型与共用体类型 说明:说明: (1) 枚举数据
36、,也就是枚举常量,只能是标识符,不能重复定义。 (2) 枚举数据往往是一些有实际含义的标识符。不过,标识符的含义可完全由程序员规定。 (3) 数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。枚举类型是有序类型。 (4) 程序员可在枚举数据时通过“=”号自己规定序号,后继序号以此递增。 (5) 枚举数据的存储占两个字节。第 9章 结构体类型与共用体类型 例如: (1) 定义枚举类型status, 包含复制与删除两种状态: enum statuscopy, delete; 枚举类型status仅有两个数据,一个是copy,一个是delete, 序号为0、 1, 代表复制与删除。 第 9章
37、结构体类型与共用体类型 (2) 定义枚举类型color,包含红、黄、蓝、白、黑五种颜色: enum color red, yellow, blue, white, black; 枚举类型color有red、 yellow、 blue、 white、 black五个数据, 序号为0、 1、 2、 3、 4, 代表红、 黄、 蓝、 白、 黑五种颜色。 第 9章 结构体类型与共用体类型 (3) 定义枚举类型weekday, 包含一周的七天: enum weekday sun, mon, tue, wed, thu, fri, sat; 枚举类型weekday有sun、 mon、 tue、 wed、
38、thu、 fri、sat七个数据, 序号为0、 1、 2、 3、4、 5、 6, 代表一周中的星期天、星期一、星期二、星期三、星期四、 星期五、星期六。 第 9章 结构体类型与共用体类型 (4) 重新定义枚举类型status,规定第一个枚举数据的序号是6。enum statuscopy=6,delete;则copy的序号为6,delete的序号为7。第 9章 结构体类型与共用体类型 9.4.2 枚举类型变量的定义枚举类型变量的定义 (1) 先定义枚举类型, 再定义枚举类型变量: enum 标识符 枚举数据表; enum 标识符 变量表; (2) 在定义枚举类型的同时定义枚举类型变量: enum
39、 标识符 枚举数据表 变量表; (3) 直接定义枚举类型变量: enum 枚举数据表 变量表; 第 9章 结构体类型与共用体类型 例如, 对枚举类型enum color, 定义枚举变量c1、 c2: enum color red, yellow, blue, white, black; enum color c1, c2; 或enum color red,yellow,blue,white,black c1, c2; 或enum red, yellow, blue, white, black c1, c2; 枚举类型数据可以进行赋值运算。枚举类型是有序类型, 枚举类型数据还可以进行关系运算。枚
40、举类型数据的比较转化成对序号进行比较, 只有同一种枚举类型的数据才能进行比较。 第 9章 结构体类型与共用体类型 将枚举型数据按整型格式输出,可得到整数值(枚举变量值的序号)。 使用强制类型转换,可将整数值(枚举值序号)转换成对应枚举值。 例如: c1=(enum color )2; /*c1得到枚举值blue*/第 9章 结构体类型与共用体类型 例例 99 某口袋中有红、 黄、 蓝、 白、 黑五种颜色的球若干个,每次从口袋中取出三个球,问得到三种不同颜色的球有多少种取法,并输出每种组合结果。 算法提示: 不用枚举类型,我们可用1代表红色、2代表黄色、3代表蓝色、4代表白色、5代表黑色,通过下
41、面的三重循环完成处理。第 9章 结构体类型与共用体类型 for (n=0,i=1;i=5;i+) /*取第一个球*/ for (j=1;j=5;j+) /*取第二个球*/ if (j!= i) /*第二个与第一个不同色*/ for(k=1;k=5;k+) /*取第三个球*/ if(k!=i) & (k!=j) /*第三个与第一、二个不同色*/ n+; /*统计有多少种取法*/ printf (%d,%d,%dn,i,j,k); /*输出一种取法*/ 第 9章 结构体类型与共用体类型 将颜色用数字表示,不如直接用red表示红色球、yellow表示黄色球、blue表示蓝色球、white表示白色球、
42、black表示黑色球,这样非常直观。请注意程序中枚举类型数据的输出。程序如下:/*程序9-9,三种不同颜色球的取法*/main( ) enum color red,yellow,blue,white,black; enum color i,j,k,l;/*i是第一个球,j是第二个球,k是第三个球*/enum color l;/*取值i、j、k,方便输出*/ int n,m;/*n种数,m为临时变量*/ for(n=0,i=red;i=black;i+) /*取第一个球*/ for(j=red;j=black;; j+) /*取第二个球*/ if(j!= i) /*第二个与第一个不同色*/ fo
43、r(k=red;k=black;k+) /*取第三个球*/ if(k!=i) & (k!=j) /*第三个与第一、二个不同色*/第 9章 结构体类型与共用体类型 n+; /*统计有多少种取法*/ printf(%4d:,n); for(m=1;m=3;m+) /*输出第n种取法*/ switch(m) case 1:1=i;berak; case 2:1=j;berak; case 3:1=k;berak; switch(l)/*间接输出*/ case red:printf(%8s,red),break; case yellow:printf(%8s,yellow);break;第 9章 结构
44、体类型与共用体类型 case blue:printf(%8s),blue);break; case white:printf(%8s,white);break;; case black:printf(%8s,black);break; printf(“n”); printf(总的取法有%d种n,n);第 9章 结构体类型与共用体类型 9.5 程序设计举例程序设计举例 例例9-10 编写程序,登录幼儿园200名小朋友的数据,按身高、年龄排序后输出。小朋友的数据包括编号、姓名、性别、年龄、身高、体重、出生日期、入园日期。 算法提示: (1) 日期数据用结构体dst描述,幼儿园一名小朋友的数据(编号
45、、姓名、性别、年龄、身高、体重、出生日期、入园日期)用嵌套结构体cst描述,幼儿园200名小朋友的数据用结构体数组all描述。 (2) 定义登录input( )、身高排序sort1( )、年龄排序sort2( )、输出output( )四个函数完成程序处理。第 9章 结构体类型与共用体类型 (3) 排序采用选择排序方法,利用外部数组传递数据,排序结果存放于原数组。 (4) 依身高、年龄排序可以考虑用同一个函数完成,将排序依据用参数传递。第 9章 结构体类型与共用体类型 程序如下:/*程序9-10,幼儿园小朋友数据登录、排序*/#define M 200 struct dst /*定义日期结构体
46、*/int year; int month; int day;struct cst /*定义描述小朋友数据的结构体*/ int no; char name12; char sex; float age; float height; float weight; dst bdate; dst edate;struct cst allM;/*定义描述所有小朋友数据的外部结构体数组*/第 9章 结构体类型与共用体类型 main( ) void input( );/*调用函数申明*/void sort1( );void sort2( );void output( );input( );/*调用登录函数
47、*/sort1( );/*调用依身高排序函数 */printf(幼儿园小朋友一览(依身高排序):n);output( );/*调用输出函数 */printf(n);sort2( );/*调用依年龄排序函数 */printf(幼儿园小朋友一览(依年龄排序):n);output( );/*再次调用输出函数 */printf(n);第 9章 结构体类型与共用体类型 void input( ) /*登录函数*/ int i;for(i=0;iM;i+) printf(依次输入第%d个小朋友的数据:n,i); scanf(%d%s%c%f%f%f%d%d%d%d%d%d,&alli.no,alli.na
48、me, &alli.sex, &alli.age,&alli.height,&alli.weight,&alli.bdate.year, &alli.bdate.month,&alli.bdate.day,&alli.edate.year, &alli.edate.month, &alli.edate.day); 第 9章 结构体类型与共用体类型 void sort1( ) /*依身高排序函数*/ int i,j; int k; struct cst t; for(i=0;iM?1;i+) k=i; for(j=i+1;jallk.height) k=j; t=alli;alli=allk;a
49、llk=t; 第 9章 结构体类型与共用体类型 void sort1( ) /*依年龄排序函数*/ int i,j; int k; struct cst t; for(i=0;iM?1;i+) k=i; for(j=i+1;jallk.age) k=j; t=alli;alli=allk;allk=t; 第 9章 结构体类型与共用体类型 void output( ) /*输出函数*/ int i; printf(编号 姓名 性别 年龄 身高 体重 出生日期 入园日期 n) for(i=0;iM;i+) printf(%4d%10s%8d%8.1f%8.2f%8.2f%6d/%2d%/2d%6d
50、/%2d/%2d,alli.no, alli.name,alli.age,alli.sex,alli.height,alli.weight,alli.bdate.year, alli.bdate.month,alli.bdate.day,alli.edate.year,alli.edate.month,alli.edate.day); printf(n); 第 9章 结构体类型与共用体类型 例9-11 编写程序,实现复数的乘法运算。算法提示:(1) 复数用结构体描述。(2) 复数的乘法运算用函数实现,函数的类型为结构体类型。程序如下:/*程序9-11,复数的乘法运算*/struct compl
51、ex float re; float ie; ;main( ) struct complex x,y; struct complex m; struct complex compm( );/*调用函数申明*/第 9章 结构体类型与共用体类型 printf(请输入第一个复数的实部,虚部:);scanf(%f,%f,&x.re,&x.ie);printf(请输入第二个复数的实部,虚部:);scanf(%f,%f,&y.re,&y.ie);m=compm(x,y);/*调用函数求积*/printf(所求复数的积=%8.3f+%8.3f i n,m.re ,m.ie);struct complex c
52、ompm(xx,xy)/*求两个复数积的函数*/struct complex xx,xy; struct complex t; t.re=xx.re*xy.re?xx.ie*xy.ie; t.ie=xx.re*xy.ie+xx.ie*xy.re; return(t); 第 9章 结构体类型与共用体类型 例例9-12 某班有50个学生,期终考试考了8门课程。求每个学生的总成绩和平均成绩,并按总成绩排序输出。 这是第8章的例8-17,我们在这里改用二维结构体数组实现,整个程序由5个函数组成。程序如下:/*程序9-12,成绩处理程序*/struct cjst char xm12;float cj9;
53、 cjs51;/*存放学生成绩的结构体数组*/float tacj513;/*存放总成绩、平均成绩的数组*/第 9章 结构体类型与共用体类型 main( ) void input( );/*调用函数申明*/ void count( ); void sort( ); void output( ); input( );/*调用输入函数*/ count( );/*调用计算函数*/ sort( );/*调用排序函数*/ output( );/*调用输出函数*/ 第 9章 结构体类型与共用体类型 void input( );/*输入函数*/ int i,j; for(i=1;i=50;i+) print
54、f(请输入第%d个学生姓名,8门课的成绩:n); scanf(%s,cjsi.xm); for(j=1;j=8;j+) scanf(%f,&cjsi.cjj); 第 9章 结构体类型与共用体类型 void count( );/*计算函数*/int i,j;for(i=1;i=50;i+) tacji1=0; for(j=1;j=8;j+)/*计算第i个同学的总成绩*/ tacji1+=cjsi.cjj; tacji2=tacji1/8;/*计算第i个同学的平均成绩*/ 第 9章 结构体类型与共用体类型 void sort( ) /*排序函数*/ int i,flag; struct cjst
55、tt; float tc; do /*冒泡排序*/ flag=0; for(i=1;itacji1) tt=cjsi;cjsi=cjsi+1;cjsi+1=t;/*交换原始数据*/ tc=tacji1;tacji1=tacji+11;tacji+11=tc;/*交换总成绩*/ tc=tacji2;tacji2=tacji+12;tacji+12=tc;/*交换平均成绩*/ flag=1; while(flag);第 9章 结构体类型与共用体类型 void output( ) /*输出函数*/ int i;printf(50个学生成绩处理结果如下:n); printf(姓名 课程1 课程2 课程
56、3 课程4 课程5 课程6 课程7 课程8 总成绩 平均成绩 名次n);for(i=1;i=50;i+) printf(%8s,cjsi.xm); for(j=1;jxrt.lp.x)& (xp.xxrt.lp.y)& (xp.yxrt.rp.y);第 9章 结构体类型与共用体类型 习习 题题 九九 1比较数组、结构体、共用体三种数据类型的异同。 2定义一个结构体类型,包含年、月、日成员,而且结构体成员除日期外,还包含时、分、秒等成员。 3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 4编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间任意两点的距离的程序。
57、5编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。 第 9章 结构体类型与共用体类型 6用一个数组存放图书的信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。 7建立一张人员登记表,表中包含人员的姓名、性别、年龄、婚否,如为已婚,则还包含爱人的姓名、年龄。将此表输出,假定人数不超过50人。 8定义一函数output( ),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括学号、姓名及三门课的成绩。 9在上题的基础上,定义一个输入函数input( ),用
58、来输入20个学生的数据到成绩数组。 第 9章 结构体类型与共用体类型 10有10个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求求出: (1) 每门课的平均成绩。 (2) 每个学生的总分及平均成绩。 11在上题的基础上,要求求出:(1) 平均分最高的学生的数据。(2) 每门课高于平均成绩的学生人数。(3) 每个学生第一门课程与平均成绩的分差。 第 9章 结构体类型与共用体类型 12有若干个运动员,每个运动员包括编号、姓名、性别、年龄、身高、体重等信息。若性别为男,则运动项目为长跑、登山;若性别为女,则运动项目为短跑、跳绳。用一个函数输入运动员信息,用另一个函数
59、求每个项目的平均成绩,再用另一个函数输出运动员信息。 13编写程序,用结构体类型实现复数的加、减、乘、除运算,每种运算用函数完成。 14编写程序,计算四边形的面积和周长,要求用结构体类型描述四边形。 15编写程序,用枚举类型实现两个数的加、减、乘、除运算,每种运算用函数完成。并请考虑多个数的运算如何实现。 第 9章 结构体类型与共用体类型 16某水果店经销8种水果。编写程序,设置每种水果的单价,输入一顾客购买的各种水果的重量,计算该顾客购买这些水果的总费用。 17某单位工资构成包括职务工资、岗位津贴、效益工资及其它,扣款包括水电费、保险金及公积金。用结构体数组描述全部员工的工资数据。编写程序,
60、计算工资总额,每个员工的应发工资、实发工资及该单位的平均工资。 18编写演讲比赛评分程序。假定有30个选手、8个评委,选手的得分是去掉最高分和最低分后的平均分。计算出每个选手的得分及本次比赛的平均分,并从高分到低分输出所有选手的得分情况。 第 9章 结构体类型与共用体类型 19编写n个学生、m门课程的成绩处理程序: (1) 实际学生人数、课程门数由键盘输入。 (2) 每个学生包括学号、姓名、成绩等信息,成绩中要求包含课程的名称,用结构体描述。所有学生数据用结构体数组描述。 (3) 求出每个学生的总成绩及平均成绩。 (4) 将学生数据按总成绩排序。 (5) 求出每门课程的平均成绩及不及格人数。 本题与第8章习题21是同一个问题,只是引入结构体实现。 另请读者考虑,排序时总成绩相同,如何进一步处理。比如我们可再按某门课程的成绩排序。 20改写本章例9-10程序,要求函数之间采用参数传递数据。