C语言习题及答案第九章.doc_第1页
C语言习题及答案第九章.doc_第2页
C语言习题及答案第九章.doc_第3页
C语言习题及答案第九章.doc_第4页
C语言习题及答案第九章.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include stdio.hstruct date char month10 ; int daynumber ; main() int i ; struct 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,ai.month,ai.daynumber) ; 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。解:#include stdio.h#include math.hstruct point float x ; float y ; float z ; main() double d1,d2,d ; struct point p1,p2 ; printf(请输入第一个点的坐标:); scanf(%f,%f,%f,&p1.x,&p1.y,&p1.z); printf(请输入第二个点的坐标:); 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个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。解:#include stdio.hstruct AddressBook char name10 ; char address30 ; char mailnumber7 ; char telphone12 ; char byphone16 ; char movephone1 ; main() int i ; struct AddressBook fd10 ; for(i=0;i10;i+) printf(请输入第%d个朋友的信息:n,i+1); printf(姓名:); scanf(%s,&) ; printf(地址:); 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第%d个朋友的信息:姓名:%sn 地址:%sn 邮编:%sn 电话:%sn 传呼:%sn 手机:%sn,i+1,,fdi.address,fdi.mailnumber,fdi.telphone,fdi.byphone,fdi.movephone) ; 思考:结构体类型变量的分量可以是各种基本数据类型(整形、实型、字符型等)或数组类型,是否可以是另一结构体类型?9-6 用一个数组存放图书信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。 解:#include stdio.h#include string.hstruct Book char booktitle30 ; char author10 ; char publishday10 ; char publishunit22 ; char lendno16 ; char stockno11 ;#define N 100 /假设图书数量不超过110册 main() int i,j,k,n; struct 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(出版社:); 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, 借出数: %s, 库存数:%sn,tsi.booktitle,tsi.author,tsi.publishday,tsi.publishunit,tsi.lendno,tsi.stockno) ; 思考:在此程序中,tsN是一个什么类型的数组?每个数组的元素大约需占多少字节内存?为什么? 9-7 建立一张人员登记表,表中包括人员的姓名、性别、年龄、婚否,如为已婚,还包括爱人的姓名、年龄。将此表输出,假定人数不超过50人。解:#include stdio.h#include string.hstruct registerable char name10 ; char sex ; int age; char marry ; char wifename10; int wifeage ;#define N 50 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.marry); if(tsi.marry=y|tsi.marry=Y) printf(妻子姓名:); scanf(%s,&tsi.wifename); printf(妻子年龄:); scanf(%s,&tsi.wifeage); else tsi.wifename= ; tsi.wifeage=0 ; printf(n通信录信息表:); printf(n 姓名 性别 年龄 婚否 妻子姓名 妻子年龄n) ; for(i=0;in;i+) printf(%8s %c %d %c %8s %dn,,tsi.sex,tsi.age,tsi.marry,tsi.wifename,tsi.wifeage); 思考: 结构体类型变量的分量与其对应类型的一般变量的区别是什么?在使用中有何不同?9-8 定义一函数output(),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括学号、姓名及三门课的成绩。解:#include stdio.h#include string.h#define STT struct studentSTT int no ; char name8 ; int c3 ;#define N 20output(STT aN) int i; printf(n学生成绩信息表n) ; printf( 学号 姓名 成绩1 成绩2 成绩3n) ; for(i=0;iN;i+) printf(%6d %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(第%d个人的信息: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等同功能语句吗?如果不用结构体,程序怎样描述? 9-9 在上体基础上,定义一个输出函数intput(),用来输入20个学生的数据到成绩数组。解:#include stdio.h#include string.h#define STT struct studentSTT int no ; char name8 ; int c3 ;#define N 20int i;output(STT aN)printf(n学生成绩信息表n) ; printf( 学号 姓名 成绩1 成绩2 成绩3n) ; for(i=0;iN;i+) printf(%6d %8s %3d %3d %3dn,ai.no,,ai.c0,ai.c1,ai.c2); input(STT aN) printf(请输入学生的学号、姓名、成绩:); for(i=0;iN;i+) printf(第%d个人的信息: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 有十个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生的数据,要求求出: (1) 每门课的平均成绩。 (2) 每个学生的总分及平均成绩。 解:#include stdio.h#include string.h#define STT struct studentSTT int 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+) printf(%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(第%d个人的信息: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.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.c1/N,av.c2/N,av.aver/N) ;思考:在此程序中,av是否可以不是结构体类型?若是,请改用其它数据形式进行处理。9-11 在上题的基础上,要求求出:(1) 平均分最高的学生的数据。(2) 每门课高于平均成绩的学生人数。 (3) 每个学生第一门课程与平均成绩的分差。解:#include stdio.h#include string.h#define STT struct studentSTT int 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;i+) printf(%6d %8s %3d %3d %3d %3d %6.2f %6.2fn,ai.no,,ai.c0,ai.c1,ai.c2,ai.total,ai.aver,ai.dfen); void input(STT aN) printf(请输入学生的学号、姓名、成绩:); for(i=0;iN;i+) printf(第%d个人的信息: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.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;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.c1/N,av.c2/N,av.aver/N) ; printf(%6d %8s %3d %3d %3d %3d %6.2f %6.2fn,csmax_i.no,csmax_i.no,csmax_,csmax_i.c0,csmax_i.c1,csmax_i.c2,csmax_i.total,csmax_i.aver,csmax_i.dfen) ; 思考:如果要计算每个学生第一门课程与该学生的平均成绩的分差,此程序应如何改动? 9-12 有若干个运动员,每个运动员包括编号、姓名、性别、年龄、身高、体重等信息。若性别为男,则运动项目为长跑、登上;若性别为女,则运动项目为短跑、跳绳。用一个函数输入运动员的信息,用另一个函数求每个项目的平均成绩,在用另一个函数输出运动员信息。解:#include stdio.h#include string.h#define ATH struct athleteATH int no ; char name8; char sex; int age ; float high ; float weight ; float event1 ; float event2 ;#define N 100int i ;output(ATH aN) printf(n运动员情况信息表n); printf( 编号 姓名 性别 年龄 身高 体重 长跑 登山 短跑 跳绳n); for(i=0;iN;i+) if(ai.sex=m|ai.sex=M) printf( %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2fn,ai.no,,ai.sex,ai.age,ai.high,ai.weight,ai.event1,ai.event2); else printf( %6d %8s %c %3d %5.1f %5.1f %6.2f %6.2fn,ai.no,,ai.sex,ai.age,ai.high,ai.weight,ai.event1,ai.event2); input(ATH aN) printf(请输入运动员的编号、姓名等相关信息:n); for(i=0;iN;i+) printf(第%d个运动员:n,i+1); printf(编号:); scanf(%d,&ai.no); printf(姓名:); scanf(%d,&); printf(性别:); scanf(%d,&ai.sex); printf(年龄:); scanf(%d,&ai.age); printf(身高:); scanf(%d,&ai.high); printf(体重:); scanf(%d,&ai.weight); if(ai.sex=m|ai.sex=M) printf(输入该运动员的“长跑”与“登山”的成绩:) ; scanf(%f,%f,&ai.event1,&ai.event2); else printf(输入该运动员的“短跑”与“跳绳”的成绩:) ; scanf(%f,%f,&ai.event1,&ai.event2); void main() int msun=0,wsun=0 ; ATH csN,mav,wav; mav.event1=0; mav.event2=0; wav.event1=0; wav.event2=0; input(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(请输入第二个数的实部,虚部:); scanf(%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.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;i4;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-d02)+sqrt(c2*(c2-d30)*(c2-d23)*(c2-d02); /*输出结果*/ printf(周长=%7.2f,面积=%7.2fn,zc,mj); 思考:如果把此题中的四边形改为平行四边形,程序该如何改写?9-15 编写程序,用枚举类型实现俩个数的加、减、乘、除运算,每种运算用函数完成,并请考虑多个数的运算如何实现。解:#include stdio.hfloat add(float a,float b) float temp ; temp=a+b; return temp ;float sub(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() enum yunsuanfua,b,c,djs; /用a,b,c,d分别表示加、减、乘、除 float x,y,s; printf(输入第一个数据:); scanf(%f,&x); printf(输入第二个数据:); scanf(%f,&y); for(js=a;js=d;js+) switch(js) case 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) ;printf(所求的商=); printf(%8.3fn,s) ; 思考:在此程序中若将主函数中的枚举类型改为字符类型进行处理,程序如下:#include stdio.hfloat add(float a,float b) float temp ; temp=a+b; return temp ;float sub(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); switch(js) case +:s=add(x,y) ;printf(所求的和=);break; case -:s=sub(x,y) ;printf(所求的差=);break; case *:s=mul(x,y) ;printf(所求的积=);break; case /:s=div(x,y) ;printf(所求的商=); printf(%8.3fn,s) ; 你认为主要区别是什么?各有何特点? 9-16 某水果经销8种水果。编写程序,设置每种水果的单价,输入一顾客购买的各种水果的重量,计算该顾客购买这些水果的总费用。 解:#include stdio.hstruct fruit char name10 ; float price ;void main() struct fruit as8=name1,1.3,name2,2.8,name3,2.1,name4,4.5,name5,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 某单位工资构成包括职务工资、岗位津贴、效益工资及其它,扣款包括水电费、保险金及公积金。用结构体数组描述全部员工的工资数据。编写程序,计算工资总额,某个员工的应发工资及该单位的平均工资。解:#include stdio.hstruct salary float 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个工人的工资情况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; /*输出结果*/ 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 perform char name10; 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(第%d个选手:n,i+1); printf(姓名:); scanf(%s,&); printf(评委的打分(8位,之间用空格分隔):); for(j=0;j8;j+) scanf(%f,&xchi.scorej); /*求每位选手的得分*/ for(i=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.df=t; strcpy(tn,); strcpy(,); strcpy(,tn); for(i=0;iN;i+) /输出结果 printf(%s,%f,,xchi.df); 思考:程序中变量t和字符数组tn的作用是什

温馨提示

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

评论

0/150

提交评论