C语言课件 第9章

上传人:cl****1 文档编号:584692130 上传时间:2024-08-31 格式:PPT 页数:98 大小:826.03KB
返回 下载 相关 举报
C语言课件 第9章_第1页
第1页 / 共98页
C语言课件 第9章_第2页
第2页 / 共98页
C语言课件 第9章_第3页
第3页 / 共98页
C语言课件 第9章_第4页
第4页 / 共98页
C语言课件 第9章_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《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程序,要求函数之间采用参数传递数据。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号