第九章实验报告
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 }