实验项目:
1, 结构体变量的应用
2, 结构体数组的应用
3, 共用体的应用
4, 结构体指针的应用
姓名: 谢丽萍实验地点: 教学楼 514 教室实验时间 2019.6.26
一, 本章要点
1, 对结构体和共用体的概念进行区分, 学会定义变量和使用变量.
2, 结构类型的定义可以嵌套, 结构类型与联合类型的定义也可以相互嵌套, 只是要注意被嵌套的类型必须先有定义.
3, 将指针, 数组与结构体或共用体相结合来实现数据的输入输出.
4, 要了解各种函数的作用, 例如: abort(),strmcmp() 等.
二, 实验内容
1, 结构体变量的应用
1问题的简单描述: 试利用结构体类型描述年, 月, 日, 输入一个日期, 统计日期是本年度第多少天.
2流程图:
3实验代码:
- #include<stdio.h>
- main()
- {
- struct date
- {
- int year;
- int month;
- int day;
- };
- struct date a;
- int i,days;
- printf("请输入年, 月, 日:");
- scanf("%d%d%d",&a.year,&a.month,&a.day);
- for(i=1;i<a.month;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||a.year%400==0)days+=29;
- else days+=28;
- }
- days+=a.day-1;
- printf("%d 年 %d 月 %d 日是该年的第 %d 天",a.year,a.month,a.day,days);
- }
4运行结果:
5问题分析:
scanf 函数中什么时候要'&', 什么时候直接用 a.year?
解决办法: 这道题中的 scanf 函数我已开始用的是 a.year, 但运行不出正确结果, 后面加了一个'&'后, 便能运行出正确结果. 对于这个问题我请教了一下同学, 总的分析了一下, 什么时候要用'&'. 当自变量是一个变量的时就要要用'&', 当自变量是一个数组时, 就不用'&', 直接用就行. 因为数组中就包含了地址所以不用'&', 这样会重复. 为变量就只是一个变量, 它不包含地址, 所以我们就要用'&'.
2, 结构体数组的应用
1问题的简单描述: 在选举中, 假设有 6 位候选人, 有 10 个人参加投票 (只能对一位候选人投票), 用结构体数组统计各候选人的得票数.
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);
- for(j=0;j<6;j++)
- {
- if(strcmp(abc,a[j].name)==0)
- a[j].count++;
- }
- }
- for(j=0;j<6;j++)
- printf("%s:%d\n",a[j].name,a[j].count);
- }
4运行结果:
5问题分析:
在用 strcmp 函数进行比较输入的姓名与候选人姓名时不会用?
解决办法: 通过百度知道了 strcmp 函数的用法.
3, 共用体的应用
1问题的简单描述: 编写程序填写表格. 从键盘输入学生和教师的信息, 若是学生, 则班级 / 职务栏填入班级; 若是教师, 则班级 / 职务栏填入职称.
2流程图:
3实验代码:
- #include<stdio.h>
- #include<stdlib.h>
- struct
- {
- int number;
- char name[30];
- char job;
- union
- {
- int classes;
- char position[10];
- }category;
- }person[2];
- main()
- {
- int i;
- for(i=0;i<2;i++)
- {
- printf("请输入编号, 姓名, 职业:");
- scanf("%d%s%s",&person[i].number,&person[i].name,&person[i].job);
- if(person[i].job=='s')
- {
- printf("请输入班级:");
- scanf("%d",&person[i].category.position);
- }
- else if(person[i].job=='t')
- {
- printf("请输入班级:");
- scanf("%s",&person[i].category.position);
- }
- else
- {
- printf("input error!");
- abort();
- }
- }
- printf("\n");
- printf("编号 \ t\t 姓名 \ t\t 职业 \ t\t 班级 / 职务 \ n");
- for(i=0;i<2;i++)
- {
- if(person[i] .job=='s')
- {
- printf("%d\t\t",person[i].number);
- printf("%s\t\t",person[i].name);
- printf("%c\t\t",person[i].job);
- printf("%d\n",person[i].category.classes);
- }
- else
- {
- printf("%d\t\t",person[i].number);
- printf("%s\t\t",person[i].name);
- printf("%c\t\t",person[i].job);
- printf("%d\n",person[i].category.classes);
- }
- }
- }
4运行结果:
5问题分析:
不知怎样使用 abort 函数?
通过这道题掌握了 abort 函数的使用方法.
这道题一开始是直接按着书来打的, 后面一直运行不出来. 后来后来有同学提出这道题的疑问, 经过老师的修改原来是书上把 name 定义成指针变量了, 后面改成数组变量就可以运行出来了.
4, 结构体指针的应用
1问题的简单描述: n 个人围成一圈, 从第 s 个人开始按顺时钟 1,2,3.....,m 的顺序报数, 数到 m 的人出圈, 然后从出圈的下一个人开始重复此过程, 输入所有出圈人的顺序. n,s,m 从键盘输入.
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);
- }
4运行结果:
5问题分析: 这道题问题不大, 结合流程图基本没啥问题.
三, 实验小结
1, 新接触了两个函数, 及 strcmp 和 abort 函数. 学会了使用这两个函数.
2, 进一步学会使用结构体类型变量, 数组, 指针的定义及输入输出方式.
3, 要学会分析代码, 明白个代码所表示的意思及作用.
来源: http://www.bubuko.com/infodetail-3109605.html