C程序设计实验报告
实验项目:构造数据类型实验
姓名:罗子健 实验地点:物联网实验室 实验时间:2019年6月26日
一、实验目的与要求
(1)掌握结构体类型说明和结构体类型变量、数组、指针的定义方法及使用。
(2)学会引用结构体中的成员。
(3)掌握利用指向结构体的指针成员构成链表的基本算法。
(4)了解联合体类型和枚举类型的说明、其变量的定义及赋初值的方法。
(5)了解联合类型变量中各成员的存储结构,学会引用各成员中的数据。
(6)学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作。
二、实验内容
9.3.1 结构体变量的应用
1、问题的简单描述:试利用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第多少天。算法描述如图所示。
2、实验流程图、代码和结果:

1 /*ex9_1*/
2 #include<stdio.h>
3 main()
4 { struct date
5 { int year;
6 int month;
7 int day;/*含有年、月、日、3个成员*/ }
8 a;/*定义结构体变量a*/
9 int i,days;/*定义其他变量*/
10 printf("输入年、月、日:");/*提示“输入年、月、日”*/
11 scanf("%d%d%d",&a.year,&a.month,&a.day);/*输入“年、月、日”*/
12 for(i=1;i<a.month;i++)
13 { if (i==1||i==3||i==5||i==7||i==8||i==10) days+=31;
14 else if(i==4||i==6||i==9||i==11) days+=30;
15 else if(a.year%100!=0&&a.year%4==0||a.year%400==0) days+=29;
16 else days+=28;}
17 days+=a.day-1;
18 printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days);/*输出结果*/
19 }

3、问题分析:day要进行-1,不然会比实际天数多1。
9.3.2 结构体数组的应用
1、问题的简单描述:
2、实验流程图、代码和结果:

1 /*ex9_2.c*/
2 #include "stdio.h"
3 #include<string.h>
4 struct person
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 { int i,j; char abc[20];
10 for(i=1;i<=10;i++)
11 { printf("输入候选人姓名:");/*提示“输入候选人名字”*/
12 scanf("%s",abc); /*输入候选人名字*/
13 for(j=0;j<6;j++)
14 if(strcmp(abc,a[j].name)==0)
15 a[j].count++;};
16 for(j=0;j<6;j++)
17 printf("%s:%d\n",a[j].name,a[j].count);/*输入各候选人的名字和得票数*/
18 }

3、问题分析:用到了strcmp比较函数进行比较来判断该候选人的票数是否加一
9.3.3 共用体的应用
1、问题的简单描述:
2、实验流程图、代码和结果:

1 /*ex9_3.c*/
2 #include "stdio.h"
3 #include<stdlib.h>
4 struct
5 { int number;
6 char name[99];
7 char job;
8 union
9 { int classes;
10 char position[10];
11 }category;
12 }person[2];
13 main()
14 { int i;
15 for(i=0;i<2;i++)
16 { scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);/*输入某人的编号、姓名、职业*/
17 if(person[i].job=='s')
18 scanf("%d",&person[i].category.classes);
19 else if(person[i].job=='t')
20 scanf("%s",&person[i].category.position);/*输入教师的职称*/
21 else
22 { printf("input error!");
23 abort();/*若输入错误,则退出程序*/
24 }
25 }
26 printf("\n");
27 printf("编号 姓名 职业 班级/职务\n");
28 for(i=0;i<2;i++)
29 if(person[i].job=='s')
30 printf("%d %s %c %d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes);/*输出学生的记录*/
31 else
32 printf("%d %s %c %s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);
33 }

3、问题分析:若要调用abort()函数退出程序,就要有包含stdlib.h的头文件。
9.3.4 结构体指针的应用
1、问题的简单描述:
2、实验流程图、代码和结果:

1 /*ex9_4.c*/
2 #include<stdio.h>
3 #define N 10 /*最多围圈人数*/
4 struct child
5 {
6 int no; /*人员编号*/
7 int next; /*下一人员编号*/
8 } ;
9 struct child link[99]; /*定义结构体数组link[N],描述所有人员*/
10 main()
11 {
12 int i,n,m,s,count,h; /*定义变量*/
13 printf("输入围圈人数,出圈人数,开始报数位置:");
14 scanf("%d%d%d",&n,&m,&s);/* 输入围圈人数n,出圈人数m,开始报数位置s*/
15 for(i=1;i<=n;i++)
16 {
17 if(i==n)
18 link[i].next=1;
19 else
20 link[i].next=i+1;
21 link[i].no=i;
22 }
23 count=0;
24 if(s==1)h=n;else h=s-1;
25 printf("出圈顺序为:");
26 while(count<n-1)/*出圈人数<围圈人数-1*/
27 {
28 i=0;
29 while(i!=m)
30 {
31 h=link[h].next;
32 if(link[h].no)
33 i++;
34 }
35 printf("%d, ",link[h].no);
36 link[h].no=0;
37 count++;
38 }
39 for(i=1;i<=n;i++)
40 if(link[i].no!=0)
41 printf("%d",link[i].no);/*输出最后留在圈中的人数*/
42 }

3、问题分析:定义数组link[N],N要定义大一些,N要大于n。
三、实验小结(在本次实验中收获与不足)
要调用abort()函数退出程序,就要有包含stdlib.h的头文件。不然就不能中止。