第九章实验报告
第九章试验报告
C程序设计实验报告
实验项目:构造数据类型试验
姓名:陈峰 实验地点:第一教学楼514教室 实验时间:2018,6,26
一、实验目的与要求
1、掌握结构体类型说明和结构体变量、数组、指针的定义方法及使用。
2、学会引用结构体中成员。
3、掌握利用指向结构体的指针成员构成链表的基本算法。
4、了解联合体类型和枚举类型的说明、其变量的定义及赋初始值的方法。
5、了解联合体类型变量中成员的储存结构,学会引用各成员中的数据。
6、学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作。
二、实验内容
1、实验练习:结构体变量的应用(9.3.1)
1问题的简单描述:试用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第几天。
2实验流程图:
3实验代码:
#include<stdio.h> main() { struct date { int year; int moth; int day; }; struct date a; int i,days;days=0; printf("输入年,月,日:"); scanf("%d,%d,%d",&a.year,&a.moth,&a.day); for(i=1;i<a.moth;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10) days+=31; else if(i==4||i==6||i==9||i==11) days+=30; else if(a.year%4==0&&a.year%100!=0) days+=29; else days+=28; } days+=a.day; printf("%d年%d月%d日是该年的第%d天",a.year,a.moth,a.day,days); }
结果:
分析:刚开始做的时候运行就老是在if里报错,后来想想觉得在C语言中if中是不可能识别文字的意思,于是改成了相应的代码就出来了,但是答案又总是多了一天,看到同学定义了days=0;于是我也加了进去,结果答案就出来了。
2、实验练习:结构体数组的应用(9.3.2)
1问题的简单描述:
2实验流程图:
3实验代码:
#include<stdio.h> #include<string.h> struct person { char name[20]; int count; }a[6]={"zhang",0,"li",0,"wang",0,"zhao",0,"liu",0,"zhu",0}; main() { int i,j;char abc[20]; for(i=1;i<=10;i++) { printf("输入候选人名字:"); scanf("%s",&abc[i]); for(j=0;j<6;j++) if(strcmp(a[j].name,&abc[i])==0) a[j].count+=1; } for(j=0;j<6;j++) printf("%s:%d\n",a[j].name,a[j].count); }
结果:
分析:在for循环里面的if里的判断卡了挺久的,看了书后面的提示这里要用到strcmp函数让输入的名字与结构体数组里的名字进行对比,如果一样就会返回一个值:0,所以只要判断返回值是否为0。
3、实验练习:公用体的应用(9.3.3)
1问题的简单描述:
2实验流程图:
3实验代码:
#include"stdio.h" #include<stdlib.h> struct { int number; char name[10]; char job; union { int classes; char position[10]; }category; }person[2]; int main() { int i; for(i=0;i<2;i++) { fflush(stdin); scanf("%c,%d,%s",&person[i].job,&person[i].number,person[i].name ); if(person[i].job=='s') { printf("请输入班级\n"); scanf("%d",&person[i].category.classes); } else if(person[i].job=='t') { printf("请输入职业\n"); scanf("%s",person[i].category.position); } else { printf("input error!"); abort(); return 0; } } printf("\n"); printf("编号 姓名 职业 班级/职务\n"); for(i=0;i<2;i++) { if(person[i].job=='s') printf("%d %s %c %d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes); else printf("%d %s %c %s\n",person[i].number,person[i].name,person[i].job,person[i].category.position); } }
结果:
分析:在第一个for循环中,一直都只能输入一个人的编号、姓名、职业然后程序直接报错,按理说是要输入两个人的才会跳出循环的。原因是C中循环结构第一遍输入可能有残留在程序中,后来在循环中加了一个fflush(stdin),清除文件缓冲区就能输入第二个了。还有问题就是结构体中的char *name,在输入时一直读取不到值,直到改成了数组才有用。person[i].name已经是表示数组的首地址了所以可以不用加&。
4、实验练习:结构体指针的应用(9.3.4)
1问题的简单描述:
2实验流程图:
3实验代码:
#include<stdio.h> #define N 10 struct child { int no; int next; }; struct child link[N]; main() { int i,n,m,s,count,h; printf("输入围圈人数,出圈报数,开始报数位置:"); scanf("%d,%d,%d",&n,&m,&s); for(i=1;i<=n;i++) { if(i==n) link[i].next=1; else link[i].next=i+1; link[i].no=i; } count=0; if(s==1)h=n;else h=s-1; printf("出圈顺序为:"); while(m<n-1) { i=0; while(i!=m) { h=link[h].next; if(link[h].no) i++; } printf("%d,",link[h].no); link[h].no=0; count++; } for(i=1;i<=n;i++) if(link[i].no!=0) printf("%d",link[h].next); }
结果:
分析:问题无。
三、实验小结
收获:
1.题目中变量没有定义初始值时,要给它定义初始值为0,字符型就为空。
2.时刻记住C语言中不能识别文字的意思,要转为代码。
3.记住strcmp()函数的用法:
功能:比较字符串s1和s2。
相关函数:wcscmp
一般形式:strcmp(s1,s2)
说明:
当s1<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0。
4:当多次循环结构中发现只能循环一次时可以考虑是否是第一次的值残留循环中,可以采用调用fflush()函数清除文件缓冲区。