第九章 构造数据类型实验
姓名:周萌 实验地点:514教室 实验时间:4.30
实验项目:
-
9.3.1.试利用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第多少天。
-
9.3.2. 在选举中进行投票,包含候选人姓名、得票数,假设有多为候选人,用结构体数组统计各候选人的得票数。
-
9.3.3. 若将教师和学生的数据放在同一表格中。教师的数据包括编号、姓名、职业和职务,学生的数据包括编号、姓名、职业和班级。试编写程序填写表格。
-
9.3.4.n个人围成一圈,从第s个人开始按顺时针1,2,3,···,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输入所有出圈人的顺序。
二、实验内容
1、结构体变量的应用
- 问题的简单描述:试利用结构体类型描述年、月、日,输入一个日期,统计日期是本年度第多少天。算法描述如图:
- 实验代码:
1 #include<stdio.h> 2 main() 3 { struct date 4 { 5 int year; 6 int month; 7 int day; 8 }; 9 struct date a; 10 int i; 11 int days; 12 printf("请输入年、月、日:"); 13 scanf("%d%d%d",&a.year,&a.month,&a.day); 14 for(i=1;i<a.month;i++) 15 { 16 if(i==1||i==3||i==5||i==7||i==8||i==10) 17 days+=31; 18 else if(i==4||i==6||i==9||i==11) 19 days+=30; 20 else if((a.year%4==0&&a.year%100!=0)||a.year==400) 21 days+=29; 22 else days+=28; 23 } 24 days+=a.day; 25 printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days-1); 26 }
运行结果:
- 问题分析:最后的days要减一才能得出真实答案。
2、结构体数组的应用
- 问题的简单描述:在选举中,假设有6位候选人,有10个人参加投票(只能对一位候选人投票),用结构体数组统计各候选人的得票数。算法描述如图:
- 实验代码:
1 #include<stdio.h> 2 #include<string.h> 3 struct person 4 { 5 char name[20]; 6 int count; 7 }a[6]={"zhang",0,"li",0,"wang",0,"zhao",0,"liu",0,"zhu",0}; 8 main() 9 { 10 int i,j; 11 char abc[20]; 12 for(i=1;i<=10;i++) 13 { 14 printf("请输入候选人的名字:"); 15 scanf("%s",abc); 16 for(j=0;j<6;j++) 17 { 18 if(strcmp(a[j].name,abc)==0) a[j].count++; 19 } 20 } 21 for(j=0;j<6;j++) 22 { 23 printf("%s:%d ",a[j].name,a[j].count); 24 } 25 }
运行结果:
- 问题分析:在比较字符串时应该应用(strcmp(a[j].name,abc)形式才能正常编译,不然会报错。
3、共用体的应用
- 问题的简单描述:编写程序填写表格。从键盘输入学生和教师的信息,若是学生,则班级/职务栏填入班级;若是教师,则班级/职务栏填入职称。算法描述如图:
- 实验代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 struct 4 { 5 int number; 6 char name[20]; 7 char job; 8 union 9 { 10 int classes; 11 char position[10]; 12 }categoty; 13 }person[2]; 14 main() 15 { 16 int i; 17 for(i=0;i<2;i++) 18 { 19 printf("请输入姓名、编号、职业:"); 20 scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job); 21 if(person[i].job=='s') 22 { 23 printf("请输入班级:"); 24 scanf("%d",&person[i].categoty.classes); 25 } 26 else if(person[i].job=='t') 27 { 28 printf("请输入教师职称:"); 29 scanf("%s",&person[i].categoty.position); 30 } 31 else 32 { 33 printf("Input error!"); 34 abort(); 35 } 36 } 37 printf(" "); 38 printf("编号 姓名 职业 班级/职务 "); 39 for(i=0;i<2;i++) 40 { 41 if(person[i].job=='s') 42 printf("%d %s %c %d ",person[i].number,person[i].name,person[i].job,person[i].categoty.classes); 43 else 44 printf("%d %s %c %s ",person[i].number,person[i].name,person[i].job,person[i].categoty.position); 45 } 46 }
运行结果:
- 问题分析:在定义结构体内元素时,name需要使用数组,不然程序会直接异常关闭。
4、结构体指针的应用
- 问题的简单描述:n个人围成一圈,从第s个人开始按顺时钟1,2,3.....,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输入所有出圈人的顺序。n,s,m从键盘输入。算法描述如下:
- 实验代码:
1 #include<stdio.h> 2 #define N 10 3 struct child 4 { 5 int no; 6 int next; 7 }; 8 struct child link[N]; 9 main() 10 { 11 int i,n,m,s,count,h; 12 printf("输入围圈人数,出圈报数,开始报数位置:"); 13 scanf("%d%d%d",&n,&m,&s); 14 for(i=1;i<=n;i++) 15 { 16 if(i==n) 17 link[i].next=1; 18 else 19 link[i].next=i+1; 20 link[i].no=i; 21 } 22 count=0; 23 if(s==1) 24 h=n; 25 else 26 { 27 h=s-1; 28 } 29 printf("出圈顺序为:"); 30 while(count<n-1) 31 { 32 i=0; 33 while(i!=m) 34 { 35 h=link[h].next; 36 if(link[h].no) 37 i++; 38 } 39 printf("%d, ",link[h].no); 40 link[h].no=0; 41 count++; 42 } 43 for(i=1;i<=n;i++) 44 { 45 if(link[i].no!=0) 46 printf("%d",link[i].no); 47 } 48 }
运行结果:
- 问题分析:最后输出留在圈中人数时,使用了count,发现结果总是出错,最后一个数字总是显示为8,最后改为link[i].no结果才正确。