第九章结构体类型与公用体类型习题及其答案 9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[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" struct point { float 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("请输入第二个点的坐标:"); 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" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[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" struct Book { char booktitle[30] ; char author[10] ; char publishday[10] ; char publishunit[22] ; char lendno[16] ; char stockno[11] ; } #define N 100 //假设图书数量不超过110册 main() { int i,j,k,n; Book ts[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;jif(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" struct registerable { char name[10] ; char sex ; int age; char marry ; char wifename[10]; int wifeage ; } #define N 50 void main() { int i,n; struct registerable ts[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"