第9章结构体类型与共用体类型习题及答案_第1页
第9章结构体类型与共用体类型习题及答案_第2页
第9章结构体类型与共用体类型习题及答案_第3页
第9章结构体类型与共用体类型习题及答案_第4页
第9章结构体类型与共用体类型习题及答案_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第九章结构体类型与公用体类型习题及其答案9-3 编写程序,使用结构体类型,输出一年十二个月的英文名称 及相应天数。解: #include stdio.hstruct datechar month10 ;int daynumber ;main()int i ;date a12=January,31,February,29,March,31,Aprial,30, May,31,June,30,july,31,August,31,September,30 ,October,31,November,30,December,31 ; for(i=0;i12;i+);printf(%d月:s%dn,i+1

2、,ai.month,ai.daynumber);思考:如何对结构体变量进行初始化?对结构体变量的引用为何要 体现为分量(或成员)的引用?9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请 考虑求空间中任意两点的距离的程序。解:#include stdio.h#include math.hstruct pointfloat x ;float y ;float z ;void main()double d1,d2,d ;point p1,p2 ;printf( 请输入第一个点的坐标: ); scanf(%f,%f,%f,&p1.x,&p1.y,&p1.z); printf( 请输入第二

3、个点的坐标: ); scanf(%f,%f,%f,&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);d=sqrt(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z);printf( 第一个点到原点的距离: %fn,d1);printf( 第二个点到原点的距离: %fn,d2);printf( 两点间的距离: %fn,d);9-5 编写输入、输出 10个朋友数

4、据的通讯录程序,每个朋友数据 包括姓名、地址、邮编、电话、传呼、手机等数据。解: #include stdio.h struct AddressBook char name10 ;char address30 ;char mailnumber7 ;char telphone12 ;char byphone16 ;char movephone1 ;void main()int i ;AddressBook fd10 ; for(i=0;i10;i+)printf(请输入第小个朋友的信息:n,i+1); printf( 姓名: );scanf(%s,&) ;printf( 地址:

5、);scanf(%s,&fdi.address) ;printf( 邮编: );scanf(%s,&fdi.mailnumber) ;printf( 电话: );scanf(%s,&fdi.telphone) ;printf( 传呼: );scanf(%s,&fdi.byphone) ;printf( 手机: );scanf(%s,&fdi.movephone) ;for(i=0;i10;i+)printf(n第小个朋友的信息: 姓名:sn地址:sn由E编: %sn 电话: %sn 传呼: %sn 手机: %sn,i+1,,fdi.address,fdi.mailnumber,

6、fdi.telph one,fdi.byphone,fdi.movephone) ;思考:结构体类型变量的分量可以是各种基本数据类型(整型、 实型、字符型等)或数组类型,是否可以是另一结构体类型?9-6 用一个数组存放图书信息, 每本图书包含书名、 作者、出版年 月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书 的信息,按出版年月排序后输出。解: #include stdio.h#include string.hstruct Bookchar booktitle30 ;char author10 ;char publishday10 ;char publishunit22 ;cha

7、r lendno16 ;char stockno11 ;#define N 100 /假设图书数量不超过 110册 main()int i,j,k,n;Book tsN ,t;printf( 请输入欲处理的图书数量: ); scanf(%d,&n);for(i=0;in;i+) printf(请输入第d本书的信息:n,i+1); printf(书名:”);scanf(%s,&tsi.booktitle) ;printf(作者:); scanf(%s,&tsi.author) ; printf(出版年月:); scanf(%s,&tsi.publishday) ; printf( 出版社: );

8、 scanf(%s,&tsi.publishunit) ; printf( 借出数: ); scanf(%s,&tsi.lendno) ; printf( 库存数: ); scanf(%s,&tsi.stockno) ;for(i=0;in-1;i+)k=i; for(j=i+1;jn;j+)if(strcmp(tsk.publishday,tsj.publishday)0) k=j ; t=tsi,tsi=tsj;tsj=t;printf(n 排序后的图书信息: ); for(i=0;in;i+)printf(n 书名: %s, 作者: %s, 出版年月: %s, 出版 社: %s, 借出数

9、: %s, 库存数: %sn,tsi.booktitle,tsi.author,tsi.publishday,tsi.publishu nit,tsi.lendno,tsi.stockno) ;思考:在此程序中, tsN 是一个什么类型的数组?每个数组的元素 大约需占多少字节内存?为什么?9-7 建立一张人员登记表,表中包括人员的姓名、性别、年龄、婚 否,如为已婚,还包括爱人的姓名、年龄。将此表输出,假定人数不 超过50人。解: #include stdio.h#include string.hstruct registerablechar name10 ;char sex ;int age;

10、char marry ;char wifename10;int wifeage ;#define N 50 void main()int i,n;struct registerable tsN ;printf( 请输入欲录入人员数量: ) ;scanf(%d,&n);for(i=0;in;i+)printf(请输入第d个人的信息:n,i+1); printf(姓名:);scanf(%s,);printf( 性别:) ;scanf(%s,tsi.sex);printf( 年龄:) ;scanf(%s,tsi.age);printf(婚否(y/n):);scanf(%s,tsi.m

11、arry);if(tsi.marry=y|tsi.marry=Y)printf( 妻子姓名: );scanf(%s,&tsi.wifename);printf( 妻子年龄: );scanf(%s,&tsi.wifeage);elsetsi.wifename= ;tsi.wifeage=0 ;printf(n 通信录信息表: );printf(n姓名 性别年龄婚否妻子姓名妻子年龄n);for(i=0;in;i+)printf(%8s %c %d %c %8s %dn,,tsi.se x,tsi.age,tsi.marry,tsi.wifename,tsi.wifeage);思考:

12、 结构体类型变量的分量与其对应类型的一般变量的区别是 什么?在使用中有何不同?9-8定义一函数output(),输出学生的成绩数组。成绩数组中有20个 学生的数据记录,每个记录包括学号、姓名及三门课的成绩。解: #include stdio.h#include string.h#define STT struct studentSTTint no ;char name8 ;int c3 ;#define N 20 output(STT aN)int i;printf(n 学生成绩信息表 n) ;pri ntf(”学号姓名成绩1 成绩2成绩3n);for(i=0;iN;i+)printf(%6d

13、 %8s%3d%3d%3dn,ai.no,,ai.c0,ai.c1,ai.c2);void main()int i ;STT csN ;printf( 请输入学生的学号、姓名、成绩: );for(i=0;iN;i+)printf(第小个人的信息:n,i+1); printf( 学号: );scanf(%d,&csi.no) ;printf( 姓名: );scanf(%d,&) ;printf( 成绩: );scanf(%d,%d,%d,&csi.c0,&csi.c1,&csi.c2) ; output(cs) ;思考:能想象在此程序中与结构体 STT等同功能语句吗

14、?如果不 用结构体,程序怎样描述?9-9 在上题基础上,定义一个输出函数 intput(), 用来输入 20个学生 的数据到成绩数组。解: #include stdio.h#include string.h#define STT struct studentSTTint no ;char name8 ;int c3 ;#define N 20int i;output(STT aN)printf(n 学生成绩信息表 n) ;pri ntf(”学号姓名成绩1 成绩2成绩3n);for(i=0;iN;i+)printf(%6d %8s%3d%3d%3dn,ai.no,,ai.c0,ai

15、.c1,ai.c2);input(STT aN)printf( 请输入学生的学号、姓名、成绩: ); for(i=0;iN;i+)printf(第小个人的信息:n,i+1);printf( 学号: ); scanf(%d,&ai.no) ;printf( 姓名: ); scanf(%d,&) ;printf( 成绩: ); scanf(%d,%d,%d,&ai.c0,&ai.c1,&ai.c2);void main()STT csN ;input(cs) ;output(cs);思考:函数的参数可以是结构体类型变量或数组,函数的返回类型 也可以是结构体类型吗?9-10 有十个学生

16、,每个学生的数据包括学号、姓名、三门课的成 绩,从键盘输入 10个学生的数据,要求求出:(1) 每门课的平均成绩。(2) 每个学生的总分及平均成绩。解: #include stdio.h#include string.h#define STT struct studentSTTint no;char name8 ;int c3;int total;float aver;#define N 10int i ;void output(STT aN)printf(n 学生成绩信息表 n) ;printf( 学号 姓名成绩1 成绩2 成绩3 总分 平均成绩 n) ;for(i=0;iN;i+)prin

17、tf(%6d %8s %3d %3d %3d %3d %6.2f n,ai.no,,ai.c0,ai.c1,ai.c2,ai.total ,ai.aver);void input(STT aN)printf( 请输入学生的学号、姓名、成绩: ); for(i=0;iN;i+)printf(第小个人的信息:n,i+1); printf( 学号: );scanf(%d,&ai.no) ;printf( 姓名: );scanf(%d,&) ;printf( 三门课成绩: );scanf(%d,%d,%d,&ai.c0,&ai.c1,&ai.c2);ai.total=ai.

18、c0+ai.c1+ai.c2;ai.aver=ai.total/N;void main()STT csN,av; input(cs) ;for(i=0;iN;i+) av.c0=av.c0+csi.c0;av.c1=av.c1+csi.c1;av.c2=av.c2+csi.c2;av.aver=av.aver+csi.aver ;output(cs) ;printf( %8s %3d %3d %3d %6.2fn,,av.c0/N,av.c 1/N,av.c2/N,av.aver/N) ;思考:在此程序中,av是否可以不是结构体类型?若是,请改用其 它数据形式进行处理。9-11

19、在上题的基础上,要求求出:(1) 平均分最高的学生的数据。(2) 每门课高于平均成绩的学生人数。(3) 每个学生第一门课程与平均成绩的分差。解: #include stdio.h#include string.h#define STT struct studentSTTint no;char name8 ;int c3;int total;float aver,dfen;#define N 3int i ,j;void output(STT aN)printf(n 学生成绩信息表 n) ;printf( 学号 姓名 成绩 1 成绩2 成绩3 总分 平均成绩 分 差 n) ;for(i=0;iN

20、;i+)printf(%6d %8s %3d %3d %3d %3d %6.2f %6.2fn,a i.no,,ai.c0,ai.c1,ai.c2,ai.total,ai.aver,ai.dfen);void input(STT aN)printf( 请输入学生的学号、姓名、成绩: );for(i=0;iN;i+)printf(第小个人的信息:n,i+1);printf( 学号: );scanf(%d,&ai.no) ;printf( 姓名: );scanf(%d,&) ;printf( 三门课成绩: );scanf(%d,%d,%d,&ai.c0,&ai.c1,&

21、ai.c2);ai.total=ai.c0+ai.c1+ai.c2;ai.aver=ai.total/N;void main()STT csN,av;int max_i=0,rnum3=0,0,0;input(cs) ;for(i=0;iN;i+)av.c0=av.c0+csi.c0;av.c1=av.c1+csi.c1;av.c2=av.c2+csi.c2;av.aver=av.aver+csi.aver ;if(av.avercsi.aver)av.aver=csi.aver;max_i=i ; / 记录平均分最高的学生for(i=0;i3;i+)av.ci=av.ci/N;for(i=0

22、;iN;i+)for(j=0;jav.cj) rnumj+ ;/ 统计每门课高于平均成绩的人数csi.dfen=csi.c0-av.c0;/ 计算每个学生第一门课与第一门课 平均成绩的分差output(cs) ;printf( %8s %3d %3d %3d %6.2fn,,av.c0/N,av.c 1/N,av.c2/N,av.aver/N) ;printf(%6d %8s %3d %3d %3d %3d %6.2f %6.2fn,csma x_i.no,csmax_i.no,csmax_,csmax_i.c0,csmax_i.c1,csm ax_i.c2,csma

23、x_i.total,csmax_i.aver,csmax_i.dfen) ;思考:如果要计算每个学生第一门课程与该学生的平均成绩的分差, 此程序应如何改动?9-12 有若干个运动员,每个运动员包括编号、姓名、性别、年龄、 身高、体重等信息。若性别为男,则运动项目为长跑、登上;若性别 为女,则运动项目为短跑、跳绳。用一个函数输入运动员的信息,用 另一个函数求每个项目的平均成绩,在用另一个函数输出运动员信 息。解: #include stdio.h#include string.h#define ATH struct athleteATHint no ;char name8;char sex;in

24、t age ;float high ;float weight ;float event1 ;float event2 ;#define N 100 int i ;output(ATH aN)printf(n 运动员情况信息表 n);printf( 编号 姓名 性别 年龄 身高 体重 长跑 登山 短跑 跳绳 n);for(i=0;i劇云=+1)_pinff(=iM&3*离師乓3烘浑 scanf(=%ffda=LevenMQoa 曰 evea-2) 八)e-se宀pinffsiM&3询离*KB*3_ scanf(=%ffda=LevenM da 曰 evea-2) 八void main。宀inf

25、 msunHpwsunHO - ATH cszLmavwaE mau.evenfkHpmav.evenKSHp wav.evenfkHpwav.evenKSHp inpuf(cs)八for(i=0;i0) printf(+) ;if(t.imag!=0)printf(%8.3fn,t.imag) ;return t ;void main()struct complex x,y ;struct complex s1,s2,s3,s4;printf( 请输入第一个数的实部,虚部: ); scanf(%f,%f,&x.real,&x.imag);printf( 请输入第二个数的实部,虚部: ); s

26、canf(%f,%f,&y.real,&y.imag);s1=add(x,y);s2=sub(x,y);s3=mul(x,y);s4=div(x,y);printf( 所求复数的和 =);disp(s1);printf( 所求复数的差 =);disp(s2);printf( 所求复数的积 =);disp(s3);printf( 所求复数的商 =);disp(s4);思考: 函数在返回时, 传给调用函数的值是一个吗?为什么?结构 体类型也可以作为返回类型吗?9-14 编写程序,计算四边形的面积和周长,要求用结构体类型描 述四边形。解: #include stdio.h#include math.

27、hstruct point / 点的结构体float x;float y ;struct sbx /四边形结构体用四个顶点表示struct point p4 ;float dist(struct point p1 ,struct point p2) /求两点距离float x=0;x=sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ; return x ;void main()struct sbx a ;float zc,mj ;int i ;float d01,d12,d23,d30,d02;float c1,c2;for( i=0;i

28、4;i+)printf(请输入第d个点的坐标:n,i+1); printf(x,y);scanf(%f,%f,&a.pi.x,&a.pi.y);/*计算四边形的周长 */d01=dist(a.p0,a.p1);d12=dist(a.p1,a.p2);d23=dist(a.p2,a.p3);d30=dist(a.p3,a.p0);zc=d01+d12+d23+d30;/*计算面积 (将四边形分割为俩个三角形 )*/ d02=dist(a.p0,a.p2) ;c1=(d01+d12+d02)/2;c2=(d30+d23+d02)/2;mj=sqrt(c1*(c1-d01)*(c1-d12)*(c1

29、-d02)+sqrt(c2*(c2-d30)*(c2-d23)*(c2 -d02);/* 输出结果 */printf(周长=%7.2f,面积=%7.2fn,zc,mj); 思考:如果把此题中的四边形改为平行四边形,程序该如何改写?9-15 编写程序,用枚举类型实现俩个数的加、减、乘、除运算,每种运算用函数完成,并请考虑多个数的运算如何实现。 解: #include stdio.h float add(float a,float b)float temp ;temp=a+b;return temp ; float sub(float a,float b)float temp ;temp=a-b;

30、return temp ; float mul(float a,float b)float temp ;temp=a*b;return temp ;float div(float a,float b)float temp ;temp=a/b;return temp ;void main()enum yun sua nfua,b,c,djs; / 用 a,b,c,c分别表示加、减、乘、除 float x,y,s;printf( 输入第一个数据: );scanf(%f,&x);printf( 输入第二个数据: );scanf(%f,&y);for(js=a;js=d;js+)switch(js)c

31、ase a:s=add(x,y) ;printf(所求的禾口 二”);break;case b:s=sub(x,y) ;printf(所求的差 二”);break;case c:s=mul(x,y) ;printf(”所求的积 二”);break; case d:s=div(x,y) ;pri ntf(” 所求的商=);printf(%8.3fn,s) ; 思考:在此程序中若将主函数中的枚举类型改为字符类型进行处理, 程序如下:#include stdio.hfloat add(float a,float b)float temp ;temp=a+b;return temp ;float su

32、b(float a,float b)float temp ;temp=a-b;return temp ;float mul(float a,float b)float temp ;temp=a*b;return temp ;float div(float a,float b)float temp ;temp=a/b;return temp ;void main()char js;float x,y,s;printf( 输入第一个数据: );scanf(%f,&x);printf( 运算符: );js=getchar();printf( 输入数据第二个数据: );scanf(%f,&y);swi

33、tch(js)case +:s=add(x,y) ;printf(所求的禾口 二”);break;case -:s=sub(x,y) ;printf(所求的差 二”);break;case *:s=mul(x,y) ;printf( 所求的积 =);break; case 7:s=div(x,y) ;pri ntf(所求的商=);printf(%8.3fn,s) ; 你认为主要区别是什么?各有何特点?9-16 某水果经销 8种水果。编写程序,设置每种水果的单价,输 入一顾客购买的各种水果的重量,计算该顾客购买这些水果的总费 用。解: #include stdio.hstruct fruitch

34、ar name10 ;float price ;void main()struct fruitas8=name1,1.3,name2,2.8,name3,2.1,name4,4.5,na me5,0.8,name6,3.0,name7,11.2,name8,6.6 ;int i;float wt,sum=0;for(i=0;i8;i+)printf(请输入第%d种水果的质量:,i+1);scanf(%f,&wt);sum=sum+wt*asi.price;printf(总费用=%fn,sum);思考:结构体类型的数组进行初始化时,主要应注意哪些问题?9-17 某单位工资构成包括职务工资、岗位津

35、贴、效益工资及其它, 扣款包括水电费、 保险金及公积金。 用结构体数组描述全部员工的工 资数据。编写程序,计算工资总额,某个员工的应发工资及该单位的 平均工资。解: #include stdio.hstruct salaryfloat zwgz ;float gwjt ;float xygz ;float qt ;float sdf ;float bxj ;float gjj ;#define N 30void main()struct salary wkN;float yfN,sfN;float zgz=0,pjgz=0;int i=0;for( i=0;iN;i+)printf(请输入第d

36、个工人的工资情况n,i+1);printf( 职务工资、岗位津贴、 效益工资、其它,水电费、保险金、 公积金分别如下 n);scanf(%f,%f,%f,%f,%f,%f,%f,&wki.zwgz,&wki.gwjt,&wki.xygz, &wki.qt,&wki.sdf,&wki.bxj,&wki.gjj);/* 计算应发工资、实发工资、总工资和平均工资 */ for(i=0;iN;i+) yfi=wki.zwgz+wki.gwjt+wki.xygz+wki.qt; sfi=yfi-wki.sdf-wki.bxj-wki.gjj ;zgz+=sfi; pjgz=zgz/N;/* 输出结果 *

37、/for(i=0;iN;i+)printf(第d个工人的应发工资为4.2f实发工资为 4.2fn,i+1,yfi,sfi);printf( 单位应发的工资总额为 %6.2fn,zgz);printf( 该单位的平均为 %4.2fn,pjgz);思考 :在使用结构体数组时,主要要注意哪些问题?9-18 编写演讲比赛评分程序,假定有 30个选手、8个评委,选手 的得分是去掉最高分和最低分的平均分。 计算出每个选手的得分及本 次比赛的平均分,并从高分到低分输出所有选手的得分情况。解:#include stdio.h#include string.hstruct performchar name10;

38、float score8;float df;#define N 30void main()struct perform xchN;float max,min,t,av=0;char tn10;int i=0,j=0;printf( 请输入每个选手的姓名及 8位评委的打分: n); for(i=0;iN;i+)printf(第小个选手:n,i+1); printf( 姓名: );scanf(%s,&);printf( 评委的打分 (8位,之间用空格分隔 ): ); for(j=0;j8;j+)scanf(%f,&xchi.scorej);/* 求每位选手的得分 */for(i=

39、0;iN;i+)xchi.df=0; max=xchi.score0; min=xchi.score0;for(j=0;j8;j+)/求选手总得分、最高分和最低分xchi.df+=xchi.scorej;if(maxxchi.scorej) min=xchi.scorej; xchi.df=(xchi.df-max-min)/6; / 计算选手的得分 av+=xchi.df ; /累加每个选手的得分av/=N ;/求出所有选手的平均分/* 根据选手得分进行排序 */for(i=0;iN-1;i+)for(j=i+1;jxchi.df)t=xchi.df ;xchi.dfxchj.df;xchj

40、.df=t; strcpy(tn,); strcpy(,); strcpy(,tn);for(i=0;iN;i+) / 输出结果printf(%s ,%f,,xchi.df);思考:程序中变量t和字符数组tn的作用是什么?当含有数组成员的 结构体又被定义为数组时,应注意哪些问题?9-19编写n个学生、m门课程的成绩处理程序:(1) 实际学生人数、课程门数由键盘输入。(2) 每个学生包括学号、姓名、成绩等信息,成绩中要求包含课程 的名称,用结构体描述。所有学生数据用结构体数据描述(3) 求出每个学生的总成绩及平均成绩。(4) 将学生数据按总成绩排序。(5) 求出每门课程的平均成绩及不及

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论