1、9-3 编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。解:#include “stdio.h“struct datechar 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
2、月:%s %dn“,i+1,ai.month,ai.daynumber) ;思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。解:#include “stdio.h“#include “math.h“struct pointfloat x ;float y ;float z ; main()double d1,d2,d ;struct point p1,p2 ; printf(“请输入第一个点的坐标:“);scanf(“%f,%f,%f“,printf(“请输入第
3、二个点的坐标:“);scanf(“%f,%f,%f“,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 AddressBookchar 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“,printf(“邮编: “)
5、;scanf(“%s“,printf(“电话: “);scanf(“%s“, printf(“传呼: “);scanf(“%s“,printf(“手机: “);scanf(“%s“, for(i=0;i10;i+)printf(“n第%d 个朋友的信息:姓名:%sn 地址:%sn 邮编:%sn 电话:%sn 传呼:%sn 手机:%sn“,i+1,fdi.name,fdi.address,fdi.mailnumber,fdi.telphone,fdi.byphone,fdi.movephone) ;思考:结构体类型变量的分量可以是各种基本数据类型(整形、实型、字符型等)或数组类型,是否可以是另一
6、结构体类型?9-6 用一个数组存放图书信息,每本图书包含书名、作者、出版年月、出版社、借出数目、库存数目等信息。编写程序输入若干本图书的信息,按出版年月排序后输出。解:#include “stdio.h“#include “string.h“struct Bookchar 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;
7、printf(“请输入欲处理的图书数量:“);scanf(“%d“,for(i=0;in;i+)printf(“请输入第 %d本书的信息:n“,i+1);printf(“书名: “);scanf(“%s“,printf(“作者: “);scanf(“%s“,printf(“出版年月: “);scanf(“%s“,printf(“出版社: “);scanf(“%s“,printf(“借出数: “);scanf(“%s“,printf(“库存数: “);scanf(“%s“,for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(strcmp(tsk.publishday,t
8、sj.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 建立一张人员登记表,表中包括人员的姓名、性别、年龄、婚否,如为已
9、婚,还包括爱人的姓名、年龄。将此表输出,假定人数不超过50人。解:#include “stdio.h“#include “string.h“struct registerablechar name10 ;char sex ;int age;char marry ;char wifename10;int wifeage ;#define N 50main()int i,n;struct registerable tsN ;printf(“请输入欲录入人员数量:“) ;scanf(“%d“, for(i=0;in;i+)printf(“请输入第 %d个人的信息:n“,i+1);printf(“姓名
10、: “) ;scanf(“%s“,tsi.name);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“,printf(“妻子年龄: “);scanf(“%s“,elsetsi.wifename=“ “ ;tsi.wifeage=0 ;printf(“n通信录信息表:“);printf(“n 姓名 性别 年龄 婚否
11、 妻子姓名 妻子年龄n“) ;for(i=0;in;i+)printf(“%8s %c %d %c %8s %dn“,tsi.name,tsi.sex,tsi.age,tsi.marry,tsi.wifename,tsi.wifeage);思考: 结构体类型变量的分量与其对应类型的一般变量的区别是什么?在使用中有何不同?9-8 定义一函数output(),输出学生的成绩数组。成绩数组中有20个学生的数据记录,每个记录包括学号、姓名及三门课的成绩。解:#include “stdio.h“#include “string.h“#define STT struct studentSTTint no
12、;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.name,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
13、“,printf(“姓名: “);scanf(“%d“,printf(“成绩: “);scanf(“%d,%d,%d“,output(cs) ; 思考:能想象在此程序中与结构体STT等同功能语句吗?如果不用结构体,程序怎样描述?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学生成
14、绩信息表n“) ;printf(“ 学号 姓名 成绩1 成绩2 成绩 3n“) ;for(i=0;iN;i+)printf(“%6d %8s %3d %3d %3dn“,ai.no,ai.name,ai.c0,ai.c1,ai.c2);input(STT aN)printf(“请输入学生的学号、姓名、成绩:“);for(i=0;iN;i+)printf(“第 %d个人的信息:n“,i+1);printf(“学号: “);scanf(“%d“,printf(“姓名: “);scanf(“%d“,printf(“成绩: “);scanf(“%d,%d,%d“,void main()STT csN
15、;input(cs) ;output(cs); 思考:函数的参数可以是结构体类型变量或数组,函数的返回类型也可以是结构体类型吗?9-10 有十个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入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)p
16、rintf(“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.name,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“,printf(“姓名: “);scanf(“%d“,printf(“三门课成绩:“);scanf(“%d,%d,%d“,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