C语言课件 第9章.ppt

上传人:sccc 文档编号:5383306 上传时间:2023-07-01 格式:PPT 页数:98 大小:826.01KB
返回 下载 相关 举报
C语言课件 第9章.ppt_第1页
第1页 / 共98页
C语言课件 第9章.ppt_第2页
第2页 / 共98页
C语言课件 第9章.ppt_第3页
第3页 / 共98页
C语言课件 第9章.ppt_第4页
第4页 / 共98页
C语言课件 第9章.ppt_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《C语言课件 第9章.ppt》由会员分享,可在线阅读,更多相关《C语言课件 第9章.ppt(98页珍藏版)》请在三一办公上搜索。

1、第 9章 结构体类型与共用体类型,9.1 结构体类型 9.2 结构体数组 9.3 共用体类型 9.4 枚举类型 9.5 程序设计举例 习 题 九,9.1 结构体类型,9.1.1 结构体类型的定义,结构体类型定义用关键字struct标识,形式为:struct 标识符 成员表;,例如,定义结构体类型,描述下列数据。(1)学生情况,包含学生的学号、姓名、性别、年龄、C语言课程成绩:,struct studentint no;/*学号*/char name8;/*姓名*/char sex;/*性别*/int age;/*年龄*/float cscore;/*C成绩*/;,如考虑30门课程成绩,加上总成

2、绩与平均成绩,可作如下定义:,struct studentint no;/*学号*/char name8;/*姓名*/char sex;/*性别*/int age;/*年龄*/float score31;/*30门课程成绩*/float tcj,acj;/*总成绩,平均成绩*/;,(2)个人数据,包含姓名、性别、年龄、身高、体重、住址:,struct personchar name8;/*姓名*/char sex;/*性别*/int age;/*年龄*/float height;/*身高*/float weight;/*体重*/char add40;/*住址*/;,(3)平面上的点:,stru

3、ct point2float x;/*横坐标*/float y;/*纵坐标*/;如考虑空间中的点,可作如下定义:struct point3float x;/*X坐标*/float y;/*Y坐标*/float z;/*Z坐标*/;,(4)日期,包括年、月、日:struct dateint year;/*年*/month;/*月*/day;/*日*/;如考虑时间,可作如下定义:struct timeint hh;/*时*/int mm;/*分*/int ss;/*秒*/;,(5)复数:struct complexfloat re;/*实部*/float ie;/*虚部*/;,(6)三角形:str

4、uct sjx float a,b,c;/*三边*/;,9.1.2 结构体变量的定义定义结构体变量有三种方法。(1)先定义结构体类型,再定义结构体变量。形式为:struct 标识符成员表;或定义为:struct 标识符 变量表;,例如,对以上定义的结构体类型,我们可以定义如下一些结构体变量:struct student zhang;/*张同学情况*/struct person p100;/*100个人的数据*/struct point2 p1,p2;/*平面上的两个点*/struct point3 po1,po2;/*空间上的两个点*/,(2)定义结构体类型的同时定义结构体变量。形式为:str

5、uct 标识符 成员表 变量表;例如,对以上定义的结构体变量,我们可以在定义结构体类型的同时定义如下:struct student int no;char name8;char sex;int age;float cscore;zhang;/*张同学情况*/,struct personchar name8;char sex;int age;float height;float weight;char add40;p100;/*100个人的数据*/,struct point2 float x;float y;p1,p2;/*平面上的两个点*/struct point3 float x;float

6、 y;float z;po1,po2;/*空间上的两个点*/,struct dateint year;/*年*/int month;/*月*/int day;/*日*/date;/*某年某月某日*/,(3)直接定义结构体变量。形式为:struct 成员表 变量表;直接定义结构体变量,在关键字struct后无标识符,不出现结构体名,仅给出成员表及变量表。例如,对以上定义的结构体变量,我们可以直接定义如下:,struct int no;char name8;char sex;int age;float cscore;zhang;/*张同学情况*/,structchar name8;char sex

7、;int age;float height;float weight;char add40;p100;/*100个人的数据*/,structfloat x;float y;p1,p2;/*平面上的两个点*/struct float x;float y;float z;po1,po2;/*空间上的两个点*/,struct int year;/*年*/int month;/*月*/day;/*日*/date;/*某年某月某日*/,如果重命名了结构体类型,则可以用新类型名来定义结构体变量。例如:,typedef structchar name8;char sex;int age;float heig

8、ht;float weight;char add40;persont;/*将结构体类型命名为persont*/persont p100;/*100个人的数据*/,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)struct po

9、int2类型变量p2,其所有分量如下:p2.x,p2.y,说明:(1)字段变量相当于相应成员类型的变量,它存取相应类型数据,并进行相应类型数据的运算操作。例如,上面例子中的zhang.no相当于整型变量,zhang.name相当于字符数组型变量,zhang.sex相当于字符型变量,zhang.age、zhang.cscore 相当于整型变量,p1.x、p1.y相当于实型变量。(2)对有的分量,其类型本身又是复杂类型,可进一步表示其相应分量。例如,zhang.name是一字符数组,其相应分量是zhang.name0、zhang.name7。(3)通过地址运算符可引用结构体变量的成员地址,也可以引

10、用结构体变量的地址。结构体变量的地址主要用作函数的参数。(4)在新标准C语言中,赋值运算可以整体引用结构体变量,相同类型结构体变量之间可以进行整体赋值。,9.1.4 结构体变量的初始化,初始化格式:存储类别 struct 结构体名成员表 结构体变量=初始化数据表;初始化数据表是相应成员的初值表。,例如:(1)extern struct student int no;char name8;int age;float cscore;zhang=9901,zhangsan,m,19,95;,即zhang.no初值为9901,zhang.name初值为zhangsan,zhang.sex初值为m,zh

11、ang.age初值为19,zhang.cscore初值为95。,(2)static struct point2float x;float y;p1=2.5,19.8;即p1.x初值为2.5,p1.y初值为19.8。,例9-1 求某同学上学期八门课程的总成绩与平均成绩。算法提示:(1)八门课程的成绩、总成绩与平均成绩都是某同学的,我们用结构体来描述。(2)整体操作可转化成对各分量进行。,程序如下:/*程序9-1,求某同学的总成绩与平均成绩*/main()struct st char xm8;float cj9;float tcj,acj;stu;/*定义结构体量stu*/int i;scanf(

12、%s,stu.xm);/*输入*/,for(i=1;i=8;i+)scan(%f,i+)stu.tcj+=stu.cji;stu.acj=stu.tcji/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-2 求平面上两点之间的距离。算法提示:(1)点用结构体描述。(2)整体操作转化成对各分量进行。,/*程序9-2,求平面上两点之间的距离*/main()struct pointfl

13、oat x;float y;p1,p2;float 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);,运行结果:请输入第一点的坐标:1,1请输入第二点的坐标:3,3两点之间的距离=2.828,/*程序9-3,复数的加减运算*/main()struct complexfloat re;float ie;x,y;/

14、*输入变量*/struct complex s1,s2;/*输出变量*/printf(请输入第一个复数的实部,虚部:);scanf(%f,%f,&x.re,&x.ie);,例9-3 复数的加减运算。算法提示:(1)复数用结构体描述。(2)整体操作转化成对各分量进行。,printf(请输入第二个复数实部,虚部:);scanf(%f,%f,&y.re,&y.ie);s1.re=x.re+y.re;/*求和*/s1.ie=x.ie+y.ie;s2.re=x.re-y.re;/*求差*/s2.ie=x.ie-y.ie;printf(所求复数的和=%8.3f+%8.3f i n,s1.re,s1.ie)

15、;printf(所求复数的差=%8.3f+%8.3f i n,s2.re,s2.ie);,运行结果:请输入第一个复数的实部,虚部:3.2,4.3请输入第二个复数实部,虚部:2.1,3.1所求复数的和=5.3+7.5 i所求复数的差=1.1+1.2 i,9.1.5 结构体作函数参数,例 9 4 将例9-2中求平面上两点之间的距离改用函数实现。,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.

16、y)*(p2.y-p1.y);return(d);,例 9 5 将例9-3中复数的加减运算改用函数实现。,/*程序9-5,采用函数实现复数的加减运算*/struct complexfloat re;float ie;main()struct 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

17、.ie);s1=csum(x,y);/*调用函数求和*/s2=csub(x,y);/*调用函数求差*/,printf(所求复数的和=%8.3f+%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)/*求两个复数差的函数*/st

18、ruct complex xx,xy;struct complex t;t.re=xx.re-xy.re;t.ie=xx.ie-+xy.ie;return(t);,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;

19、,我们也可采用如下的嵌套结构体形式:struct personchar name8;char sex;int age;struct dateint year;month;day;birthday;/*增加的结构体成员*/float height;float weight;char add40;,对于嵌套结构体,其最终成员需用多级点运算完成描述,其它处理同前所述。例如:struct person zhou;出生年份为zhou.birthday.year,出生月份为zhou.birthday.month,出生日期为zhou.birthday.day。结构体还可以自己嵌套自己,成为递归结构体,这将在

20、第10章10.5节中涉及。,9.2 结构体数组,结构体数组的定义与结构体变量的定义一样有以下三种形式:(1)Struct 标识符 成员表;struct 标识符 数组名常量;(2)struct 标识符 成员表 数组名常量;(3)struct 成员表 数组名常量;,例如,100个同学的情况,我们可以定义结构体数组allst描述:struct studentint no;char name8;char sex;int age;float score31;float tcj,acj;allst100;,对结构体数组allst的操作要转化成对allsti进行操作,而allsti的操作要转化成对allst

21、i.no、allsti.name、allsti.sex、allsti.age、allsti.score、allsti.tcj、allsti.acj进行操作。allsti.no、allsti.name、allsti.sex、allsti.age、allsti.score、allsti.tcj、allsti.acj相当于对应基类型的量。,例 9 6 用结构体数组处理全班50个同学的C语言课程成绩。,/*程序9-6,用结构体数组处理C语言成绩,排序输出*/define STT struct studentSTTchar xm8;float c;main()STT cs51;/*存放50个同学的姓名、

22、C成绩*/int i;int flag;STT t;/*排序时用于交换数据*/for(i=1;i 50;i+)/*输入50个同学的姓名、C成绩*/,scanf(%s%f,&csi.xm,&csi.c);do/*冒泡排序*/flag=1;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-7 假设有5个候选人,有20人参加投票

23、,规定只能在5个候选人中选一个,多选或选这5人以外者均为废票。试用结构体数组编写程序,统计出5位候选人各人所得票数。算法提示:(1)用结构体描述一位候选人的情况,包括其姓名及所得票数两项。5个候选人的数据用一结构体数组描述,在定义时初始化,即刚开始时得票数均为0。(2)20人投票用循环处理。,程序如下:/*程序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+),scanf(%s,

24、tp);for(j=0;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.3 共用体类型,9.3.1 共用体类型定义 共用体类型定义与结构体类型定义类似,只是改用关键字union

25、标识。其形式为:union 标识符 成员表;,标识符给出共用体名,是共用体类型名的主体,定义的共用体类型由“union 标识符”标识。例如,定义共用体类型,要求包含一个整型成员、一个字符型成员和一个单精度型成员:union icfint i;char c;float f;,9.3.2 共用体变量的定义,(1)先定义共用体类型,再定义共用体变量:union 共用体名 成员表;union 共用体名 变量表;(2)定义共用体类型的同时定义共用体变量:union 共用体名 成员表 变量表;(3)直接定义共用体变量:union 成员表 变量表;,9.3.3 共用体变量的引用,共用体变量不能直接被使用,只

26、能使用它的某个成员,通过共用体变量名与共用体成员名进行点运算得到。形式为:共用体变量名.共用体成员名 例如:union icf x;共用体类型变量x占有4个字节的空间,x.i表示其整型成员,x.c表示其字符型成员,x.f表示其单精度型成员。,说明:(1)共用体变量中可以包含若干成员及若干种类型,但共用体成员不能同时使用。在每一时刻,只能引用一个成员。共用体变量中起作用的成员值是最后一次存储的成员值。(2)共用体变量所有成员共用同一段内存单元,共用体变量和它的各个成员具有相同的地址。后来存放的共用体成员值将覆盖之前存放的共用体成员值,故只能使用最后一次存储的共用体成员值。,(3)不能对共用体变量

27、进行初始化和赋值,也不能通过引用共用体变量名来得到某成员的值。(4)共用体变量不能作函数参数,函数的返回值也不能是共用体类型。(5)共用体类型和结构体类型可以相互嵌套,共用体中的成员可以为数组,甚至还可以定义为共用体数组。,例 9-8 设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。,程序如下:/*程序9-8,输入/输出教师信息*/union cf char clname30;/*所讲课程*/int num;/*论文数目*/;struct teachersint no;/*编号*/char name12;/*姓名*/ch

28、ar zc;/*职称*/union cf x;/*可变字段,为所讲课程或论文数目*/,teach10;/*假设有10位教师*/main()int i;for(i=0;i10;i+)/*输入数据*/scanf(%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);,printf(编号 姓名 职称

29、 讲授课程或论文数n);/*输出数据*/for(i=0;i10;i+)printf(%12d%12s%6c,teachi.No,teachi.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.4 枚举类型,9.4.1 枚举类型的定义,枚举类型定义用关键字enum标识,形式为:enum 标识符 枚举数据表;标识符用来区分不同的枚举类型,定义的枚举类型用enum标识符”标识。,说明:(1)

30、枚举数据,也就是枚举常量,只能是标识符,不能重复定义。(2)枚举数据往往是一些有实际含义的标识符。不过,标识符的含义可完全由程序员规定。(3)数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。枚举类型是有序类型。(4)程序员可在枚举数据时通过“=”号自己规定序号,后继序号以此递增。(5)枚举数据的存储占两个字节。,例如:(1)定义枚举类型status,包含复制与删除两种状态:enum statuscopy,delete;枚举类型status仅有两个数据,一个是copy,一个是delete,序号为0、1,代表复制与删除。,(2)定义枚举类型color,包含红、黄、蓝、白、黑五种颜色:enu

31、m color red,yellow,blue,white,black;枚举类型color有red、yellow、blue、white、black五个数据,序号为0、1、2、3、4,代表红、黄、蓝、白、黑五种颜色。,(3)定义枚举类型weekday,包含一周的七天:enum weekday sun,mon,tue,wed,thu,fri,sat;枚举类型weekday有sun、mon、tue、wed、thu、fri、sat七个数据,序号为0、1、2、3、4、5、6,代表一周中的星期天、星期一、星期二、星期三、星期四、星期五、星期六。,(4)重新定义枚举类型status,规定第一个枚举数据的序号

32、是6。enum statuscopy=6,delete;则copy的序号为6,delete的序号为7。,9.4.2 枚举类型变量的定义,(1)先定义枚举类型,再定义枚举类型变量:enum 标识符 枚举数据表;enum 标识符 变量表;(2)在定义枚举类型的同时定义枚举类型变量:enum 标识符 枚举数据表 变量表;(3)直接定义枚举类型变量:enum 枚举数据表 变量表;,例如,对枚举类型enum color,定义枚举变量c1、c2:enum color red,yellow,blue,white,black;enum color c1,c2;或enum color red,yellow,bl

33、ue,white,black c1,c2;或enum red,yellow,blue,white,black c1,c2;枚举类型数据可以进行赋值运算。枚举类型是有序类型,枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较,只有同一种枚举类型的数据才能进行比较。,将枚举型数据按整型格式输出,可得到整数值(枚举变量值的序号)。使用强制类型转换,可将整数值(枚举值序号)转换成对应枚举值。例如:c1=(enum color)2;/*c1得到枚举值blue*/,例 99 某口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取出三个球,问得到三种不同颜色的球有多少种取法,并输

34、出每种组合结果。算法提示:不用枚举类型,我们可用1代表红色、2代表黄色、3代表蓝色、4代表白色、5代表黑色,通过下面的三重循环完成处理。,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);/*输出一种取法*/,将颜色用数字表示,不如直接用red表示红色球、yellow表示黄色球、blue表示蓝色球、white表示

35、白色球、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)/*第二个与第一个不同色*/for(k=red;

36、k=black;k+)/*取第三个球*/if(k!=i)&(k!=j)/*第三个与第一、二个不同色*/,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;,case blue:printf(%8s),blue);break;case white:p

37、rintf(%8s,white);break;;case black:printf(%8s,black);break;printf(“n”);printf(总的取法有%d种n,n);,9.5 程序设计举例,例9-10 编写程序,登录幼儿园200名小朋友的数据,按身高、年龄排序后输出。小朋友的数据包括编号、姓名、性别、年龄、身高、体重、出生日期、入园日期。算法提示:(1)日期数据用结构体dst描述,幼儿园一名小朋友的数据(编号、姓名、性别、年龄、身高、体重、出生日期、入园日期)用嵌套结构体cst描述,幼儿园200名小朋友的数据用结构体数组all描述。(2)定义登录input()、身高排序sort

38、1()、年龄排序sort2()、输出output()四个函数完成程序处理。,(3)排序采用选择排序方法,利用外部数组传递数据,排序结果存放于原数组。(4)依身高、年龄排序可以考虑用同一个函数完成,将排序依据用参数传递。,程序如下:/*程序9-10,幼儿园小朋友数据登录、排序*/#define M 200 struct dst/*定义日期结构体*/int year;int month;int day;struct cst/*定义描述小朋友数据的结构体*/int no;char name12;char sex;float age;float height;float weight;dst bdat

39、e;dst edate;struct cst allM;/*定义描述所有小朋友数据的外部结构体数组*/,main()void input();/*调用函数申明*/void sort1();void sort2();void output();input();/*调用登录函数*/sort1();/*调用依身高排序函数*/printf(幼儿园小朋友一览(依身高排序):n);output();/*调用输出函数*/printf(n);sort2();/*调用依年龄排序函数*/printf(幼儿园小朋友一览(依年龄排序):n);output();/*再次调用输出函数*/printf(n);,void i

40、nput()/*登录函数*/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.name,&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);,void sort1()/*依身高排序函数*/int i,j;int k;st

41、ruct cst t;for(i=0;iallk.height)k=j;t=alli;alli=allk;allk=t;,void sort1()/*依年龄排序函数*/int i,j;int k;struct cst t;for(i=0;iallk.age)k=j;t=alli;alli=allk;allk=t;,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/%2d/%2d,alli.no,a

42、lli.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-11 编写程序,实现复数的乘法运算。算法提示:(1)复数用结构体描述。(2)复数的乘法运算用函数实现,函数的类型为结构体类型。程序如下:/*程序9-11,复数的乘法运算*/struct complex float re;float ie;main()struct comple

43、x x,y;struct complex m;struct complex compm();/*调用函数申明*/,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 compm(xx,xy)/*求两个复数积的函数*/struct complex xx,xy;struct complex t;t.r

44、e=xx.re*xy.re?xx.ie*xy.ie;t.ie=xx.re*xy.ie+xx.ie*xy.re;return(t);,例9-12 某班有50个学生,期终考试考了8门课程。求每个学生的总成绩和平均成绩,并按总成绩排序输出。这是第8章的例8-17,我们在这里改用二维结构体数组实现,整个程序由5个函数组成。程序如下:/*程序9-12,成绩处理程序*/struct cjst char xm12;float cj9;cjs51;/*存放学生成绩的结构体数组*/float tacj513;/*存放总成绩、平均成绩的数组*/,main()void input();/*调用函数申明*/void

45、count();void sort();void output();input();/*调用输入函数*/count();/*调用计算函数*/sort();/*调用排序函数*/output();/*调用输出函数*/,void input();/*输入函数*/int i,j;for(i=1;i=50;i+)printf(请输入第%d个学生姓名,8门课的成绩:n);scanf(%s,cjsi.xm);for(j=1;j=8;j+)scanf(%f,&cjsi.cjj);,void count();/*计算函数*/int i,j;for(i=1;i=50;i+)tacji1=0;for(j=1;j=8

46、;j+)/*计算第i个同学的总成绩*/tacji1+=cjsi.cjj;tacji2=tacji1/8;/*计算第i个同学的平均成绩*/,void sort()/*排序函数*/int i,flag;struct cjst 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;whi

47、le(flag);,void output()/*输出函数*/int i;printf(50个学生成绩处理结果如下:n);printf(姓名 课程1 课程2 课程3 课程4 课程5 课程6 课程7 课程8 总成绩 平均成绩 名次n);for(i=1;i=50;i+)printf(%8s,cjsi.xm);for(j=1;j=8;j+)printf(%7.2f,cjsi.cjj);printf(%7.2f%7.2f%5d,tacji1,tacji2,i);printf(n);,例9-13 编写程序,判断一点是否在矩形内。算法提示:(1)点用结构体描述,矩形用左下角、右上角两点描述,也是一个结构体

48、。(2)通过定义用结构体作参数的函数完成点是否在矩形内的判断。,程序如下;/*例9-13,判断一点是否在矩形内*/struct point/*点结构体*/float x;float y;struct rect/*矩形结构体*/struct point lp;struct point rp;int ifp();,main()struct point p;/*点p*/struct rect rt;/*矩形rt*/clrscr();printf(输入点的坐标:);scanf(%f,%f,&p.x,&p.y);printf(输入矩形的左下角点:);scanf(%f,%f,&rt.lp.x,&rt.lp

49、.y);printf(输入矩形的右上角点:);scanf(%f,%f,&rt.rp.x,&rt.rp.y);if(ifp(p,rt)printf(点在矩形内!);else printf(点不在矩形内!);,int ifp(xp,xrt)/*判断函数*/struct point xp;struct rect xrt;return(xp.xxrt.lp.x)&(xp.xxrt.lp.y)&(xp.yxrt.rp.y);,习 题 九,1比较数组、结构体、共用体三种数据类型的异同。2定义一个结构体类型,包含年、月、日成员,而且结构体成员除日期外,还包含时、分、秒等成员。3编写程序,使用结构体类型,输出

50、一年十二个月的英文名称及相应天数。4编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间任意两点的距离的程序。5编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。,6用一个数组存放图书的信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。7建立一张人员登记表,表中包含人员的姓名、性别、年龄、婚否,如为已婚,则还包含爱人的姓名、年龄。将此表输出,假定人数不超过50人。8定义一函数output(),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号