第9章结构体类型与共用体类型习题及答案.docx
- 文档编号:26845778
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:36
- 大小:23.39KB
第9章结构体类型与共用体类型习题及答案.docx
《第9章结构体类型与共用体类型习题及答案.docx》由会员分享,可在线阅读,更多相关《第9章结构体类型与共用体类型习题及答案.docx(36页珍藏版)》请在冰豆网上搜索。
第9章结构体类型与共用体类型习题及答案
第九章结构体类型与公用体类型习题及其答案
9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。
解:
#include"stdio.h"
structdate
{
charmonth[10];
intdaynumber;
}
main()
{
inti;
datea[12]
={{"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;i<12;i++);
printf("%d月:
%s%d\n",i+1,a[i].month,a[i].daynumber);
}
思考:
如何对结构体变量进行初始化?
对结构体变量的引用为何要体现为分量(或成员)的引用?
9-4编写程序求空间任一点到原点的距离,点用结构体描述。
并请考虑求空间中任意两点的距离的程序。
解:
#include"stdio.h"
#include"math.h"
structpoint
{
floatx;
floaty;
floatz;
}
voidmain()
{
doubled1,d2,d;
pointp1,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("第一个点到原点的距离:
%f\n",d1);
printf("第二个点到原点的距离:
%f\n",d2);
printf("两点间的距离:
%f\n",d);
}
9-5编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括、地址、邮编、、传呼、手机等数据。
解:
#include"stdio.h"
structAddressBook
{
charname[10];
charaddress[30];
charmailnumber[7];
chartelphone[12];
charbyphone[16];
charmovephone[1];
}
voidmain()
{
inti;
AddressBookfd[10];
for(i=0;i<10;i++)
{
printf("请输入第%d个朋友的信息:
\n",i+1);
printf(":
");
scanf("%s",&fd[i].name);
printf("地址:
");
scanf("%s",&fd[i].address);
printf("邮编:
");
scanf("%s",&fd[i].mailnumber);
printf(":
");
scanf("%s",&fd[i].telphone);
printf("传呼:
");
scanf("%s",&fd[i].byphone);
printf("手机:
");
scanf("%s",&fd[i].movephone);
}
for(i=0;i<10;i++)
{
printf("\n第%d个朋友的信息:
\:
%s\n地址:
%s\n邮编:
%s\n:
%s\n传呼:
%s\n手机:
%s\n",i+1,fd[i].name,fd[i].address,fd[i].mailnumber,fd[i].telphone,fd[i].byphone,fd[i].movephone);
}
}
思考:
结构体类型变量的分量可以是各种基本数据类型(整型、实型、字符型等)或数组类型,是否可以是另一结构体类型?
9-6用一个数组存放图书信息,每本图书包含书名、作者、出版年月、、借出数目、库存数目等信息。
编写程序输入若干本图书的信息,按出版年月排序后输出。
解:
#include"stdio.h"
#include"string.h"
structBook
{
charbooktitle[30];
charauthor[10];
charpublishday[10];
charpublishunit[22];
charlendno[16];
charstockno[11];
}
#defineN100//假设图书数量不超过110册
main()
{
inti,j,k,n;
Bookts[N],t;
printf("请输入欲处理的图书数量:
");
scanf("%d",&n);
for(i=0;i { printf("请输入第%d本书的信息: \n",i+1); printf("书名: "); scanf("%s",&ts[i].booktitle); printf("作者: "); scanf("%s",&ts[i].author); printf("出版年月: "); scanf("%s",&ts[i].publishday); printf(": "); scanf("%s",&ts[i].publishunit); printf("借出数: "); scanf("%s",&ts[i].lendno); printf("库存数: "); scanf("%s",&ts[i].stockno); } for(i=0;i { k=i; for(j=i+1;j if(strcmp(ts[k].publishday,ts[j].publishday)<0)k=j; {t=ts[i],ts[i]=ts[j];ts[j]=t;} } printf("\n排序后的图书信息: "); for(i=0;i { printf("\n书名: %s,作者: %s,出版年月: %s,: %s,借出数: %s,库存数: %s\n",ts[i].booktitle,ts[i].author,ts[i].publishday,ts[i].publishunit,ts[i].lendno,ts[i].stockno); } } 思考: 在此程序中,ts[N]是一个什么类型的数组? 每个数组的元素大约需占多少字节存? 为什么? 9-7建立一人员登记表,表中包括人员的、性别、年龄、婚否,如为已婚,还包括爱人的、年龄。 将此表输出,假定人数不超过50人。 解: #include"stdio.h" #include"string.h" structregisterable { charname[10]; charsex; intage; charmarry; charwifename[10]; intwifeage; } #defineN50 voidmain() { inti,n; structregisterablets[N]; printf("请输入欲录入人员数量: "); scanf("%d",&n); for(i=0;i { printf("请输入第%d个人的信息: \n",i+1); printf(": "); scanf("%s",ts[i].name); printf("性别: "); scanf("%s",ts[i].sex); printf("年龄: "); scanf("%s",ts[i].age); printf("婚否(y/n): "); scanf("%s",ts[i].marry); if(ts[i].marry=='y'||ts[i].marry=='Y') { printf("妻子: "); scanf("%s",&ts[i].wifename); printf("妻子年龄: "); scanf("%s",&ts[i].wifeage); } else { ts[i].wifename=""; ts[i].wifeage=0; } } printf("\n通信录信息表: "); printf("\n性别年龄婚否妻子妻子年龄\n"); for(i=0;i { printf("%8s%c%d%c%8s%d\n",ts[i].name,ts[i].sex,ts[i].age,ts[i].marry,ts[i].wifename,ts[i].wifeage); } } 思考: 结构体类型变量的分量与其对应类型的一般变量的区别是什么? 在使用中有何不同? 9-8定义一函数output(),输出学生的成绩数组。 成绩数组中有20个学生的数据记录,每个记录包括学号、及三门课的成绩。 解: #include"stdio.h" #include"string.h" #defineSTTstructstudent STT { intno; charname[8]; intc[3]; } #defineN20 output(STTa[N]) { inti; printf("\n学生成绩信息表\n"); printf("学号成绩1成绩2成绩3\n"); for(i=0;i { printf("%6d%8s%3d%3d%3d\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2]); } } voidmain() { inti; STTcs[N]; printf("请输入学生的学号、、成绩: "); for(i=0;i { printf("第%d个人的信息: \n",i+1); printf("学号: "); scanf("%d",&cs[i].no); printf(": "); scanf("%d",&cs[i].name); printf("成绩: "); scanf("%d,%d,%d",&cs[i].c[0],&cs[i].c[1],&cs[i].c[2]); } output(cs); } 思考: 能想象在此程序中与结构体STT等同功能语句吗? 如果不用结构体,程序怎样描述? 9-9在上题基础上,定义一个输出函数intput(),用来输入20个学生的数据到成绩数组。 解: #include"stdio.h" #include"string.h" #defineSTTstructstudent STT { intno; charname[8]; intc[3]; }; #defineN20 inti; output(STTa[N]) { printf("\n学生成绩信息表\n"); printf("学号成绩1成绩2成绩3\n"); for(i=0;i { printf("%6d%8s%3d%3d%3d\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2]); } } input(STTa[N]) { printf("请输入学生的学号、、成绩: "); for(i=0;i { printf("第%d个人的信息: \n",i+1); printf("学号: "); scanf("%d",&a[i].no); printf(": "); scanf("%d",&a[i].name); printf("成绩: "); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]); } } voidmain() { STTcs[N]; input(cs); output(cs); } 思考: 函数的参数可以是结构体类型变量或数组,函数的返回类型也可以是结构体类型吗? 9-10有十个学生,每个学生的数据包括学号、、三门课的成绩,从键盘输入10个学生的数据,要求求出: (1) 每门课的平均成绩。 (2)每个学生的总分及平均成绩。 解: #include"stdio.h" #include"string.h" #defineSTTstructstudent STT { intno; charname[8]; intc[3]; inttotal; floataver; }; #defineN10 inti; voidoutput(STTa[N]) { printf("\n学生成绩信息表\n"); printf("学号成绩1成绩2成绩3总分平均成绩\n"); for(i=0;i { printf("%6d%8s%3d%3d%3d%3d%6.2f\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total,a[i].aver); } } voidinput(STTa[N]) { printf("请输入学生的学号、、成绩: "); for(i=0;i { printf("第%d个人的信息: \n",i+1); printf("学号: "); scanf("%d",&a[i].no); printf(": "); scanf("%d",&a[i].name); printf("三门课成绩: "); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]); a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2]; a[i].aver=a[i].total/N; } } voidmain() { STTcs[N],av; input(cs); for(i=0;i { av.c[0]=av.c[0]+cs[i].c[0]; av.c[1]=av.c[1]+cs[i].c[1]; av.c[2]=av.c[2]+cs[i].c[2]; av.aver=av.aver+cs[i].aver; } output(cs); printf("%8s%3d%3d%3d%6.2f\n",av.name,av.c[0]/N,av.c[1]/N,av.c[2]/N,av.aver/N); } 思考: 在此程序中,av是否可以不是结构体类型? 若是,请改用其它数据形式进行处理。 9-11在上题的基础上,要求求出: (1)平均分最高的学生的数据。 (2)每门课高于平均成绩的学生人数。 (3)每个学生第一门课程与平均成绩的分差。 解: #include"stdio.h" #include"string.h" #defineSTTstructstudent STT { intno; charname[8]; intc[3]; inttotal; floataver,dfen; }; #defineN3 inti,j; voidoutput(STTa[N]) { printf("\n学生成绩信息表\n"); printf("学号成绩1成绩2成绩3总分平均成绩分差\n"); for(i=0;i { printf("%6d%8s%3d%3d%3d%3d%6.2f%6.2f\n",a[i].no,a[i].name,a[i].c[0],a[i].c[1],a[i].c[2],a[i].total,a[i].aver,a[i].dfen); } } voidinput(STTa[N]) { printf("请输入学生的学号、、成绩: "); for(i=0;i { printf("第%d个人的信息: \n",i+1); printf("学号: "); scanf("%d",&a[i].no); printf(": "); scanf("%d",&a[i].name); printf("三门课成绩: "); scanf("%d,%d,%d",&a[i].c[0],&a[i].c[1],&a[i].c[2]); a[i].total=a[i].c[0]+a[i].c[1]+a[i].c[2]; a[i].aver=a[i].total/N; } } voidmain() { STTcs[N],av; intmax_i=0,rnum[3]={0,0,0}; input(cs); for(i=0;i { av.c[0]=av.c[0]+cs[i].c[0]; av.c[1]=av.c[1]+cs[i].c[1]; av.c[2]=av.c[2]+cs[i].c[2]; av.aver=av.aver+cs[i].aver; if(av.aver { av.aver=cs[i].aver; max_i=i;//记录平均分最高的学生 } } for(i=0;i<3;i++) av.c[i]=av.c[i]/N; for(i=0;i { for(j=0;j<3;j++) if(cs[i].c[j]>av.c[j])rnum[j]++;//统计每门课高于平均成绩的人数 cs[i].dfen=cs[i].c[0]-av.c[0];//计算每个学生第一门课与第一门课平均成绩的分差 } output(cs); printf("%8s%3d%3d%3d%6.2f\n",av.name,av.c[0]/N,av.c[1]/N,av.c[2]/N,av.aver/N); printf("%6d%8s%3d%3d%3d%3d%6.2f%6.2f\n",cs[max_i].no,cs[max_i].no,cs[max_i].name,cs[max_i].c[0],cs[max_i].c[1],cs[max_i].c[2],cs[max_i].total,cs[max_i].aver,cs[max_i].dfen); } 思考: 如果要计算每个学生第一门课程与该学生的平均成绩的分差,此程序应如何改动? 9-12有若干个运动员,每个运动员包括编号、、性别、年龄、身高、体重等信息。 若性别为男,则运动项目为长跑、登上;若性别为女,则运动项目为短跑、跳绳。 用一个函数输入运动员的信息,用另一个函数求每个项目的平均成绩,在用另一个函数输出运动员信息。 解: #include"stdio.h" #include"string.h" #defineATHstructathlete ATH { intno; charname[8]; charsex; intage; floathigh; floatweight; floatevent1; floatevent2; }; #defineN100 inti; output(ATHa[N]) { printf("\n运动员情况信息表\n"); printf("编号性别年龄身高体重长跑登山短跑跳绳\n"); for(i=0;i { if(a[i].sex=='m'||a[i].sex=='M') printf("%6d%8s%c%3d%5.1f%5.1f%6.2f%6.2f\n",a[i].no,a[i].name,a[i].sex,a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); else printf("%6d%8s%c%3d%5.1f%5.1f%6.2f%6.2f\n",a[i].no,a[i].name,a[i].sex,a[i].age,a[i].high,a[i].weight,a[i].event1,a[i].event2); } } input(ATHa[N]) { printf("请输入运动员的编号、等相关信息: \n"); for(i=0;i { printf("第%d个运动员: \n",i+1); printf("编号: "); scanf("%d",&a[i].no); printf(": "); scanf("%d",&a[i].name); printf("性别: "); scanf("%d",&a[i].sex); printf("年龄: "); scanf("%d",&a[i].age); printf("身高: "); scanf("%d",&a[i].high); printf("体重: "); scanf("%d",&a[i].weight); if(a[i].sex=='m'||a[i].sex=='M') { printf("输入该运动员的“长跑”与“登山”的成绩: "); scanf("%f,%f",&a[i].event1,&a[i].event2); } else { printf("输入该运动员的“短跑”与“跳绳”的成绩: "); scanf("%f,%f",&a[i].event1,&a[i].event2); } } } voidmain() { int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 类型 共用 习题 答案