第九章 构造数据类型实验
姓名:周萌 实验地点:514教室 实验时间:4.30
实验项目:
-
9.3.1.试利用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第多少天。
-
9.3.2. 在选举中进行投票,包含候选人姓名、得票数,假设有多为候选人,用结构体数组统计各候选人的得票数。
-
9.3.3. 若将教师和学生的数据放在同一表格中。教师的数据包括编号、姓名、职业和职务,学生的数据包括编号、姓名、职业和班级。试编写程序填写表格。
-
9.3.4.n个人围成一圈,从第s个人开始按顺时针1,2,3,···,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输入所有出圈人的顺序。
二、实验内容
1、结构体变量的应用
- 问题的简单描述:试利用结构体类型描述年、月、日,输入一个日期,统计日期是本年度第多少天。算法描述如图:
- 实验代码:
1 #include2 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
运行结果:
- 问题分析:最后的days要减一才能得出真实答案。
2、结构体数组的应用
- 问题的简单描述:在选举中,假设有6位候选人,有10个人参加投票(只能对一位候选人投票),用结构体数组统计各候选人的得票数。算法描述如图:
- 实验代码:
1 #include2 #include 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\n",a[j].name,a[j].count);24 } 25 }
运行结果:
- 问题分析:在比较字符串时应该应用(strcmp(a[j].name,abc)形式才能正常编译,不然会报错。
3、共用体的应用
- 问题的简单描述:编写程序填写表格。从键盘输入学生和教师的信息,若是学生,则班级/职务栏填入班级;若是教师,则班级/职务栏填入职称。算法描述如图:
- 实验代码:
1 #include2 #include 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 else32 {33 printf("Input error!");34 abort();35 }36 }37 printf("\n");38 printf("编号\t姓名\t职业\t班级/职务\n");39 for(i=0;i<2;i++)40 {41 if(person[i].job=='s')42 printf("%d\t%s\t%c\t%d\n",person[i].number,person[i].name,person[i].job,person[i].categoty.classes); 43 else44 printf("%d\t%s\t%c\t%s\n",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 #include2 #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 else19 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
运行结果:
- 问题分析:最后输出留在圈中人数时,使用了count,发现结果总是出错,最后一个数字总是显示为8,最后改为link[i].no结果才正确。
三、实验小结
1、太相信书上所言,导致的错误不计其数,不能只相信书上,有时候还要加入自己的思考。
2、结构体和共用体变量一定要熟练运用,并且知道他们各自依靠何种方式存储。