实验项目:
1, 结构体变量的运用
2, 结构体数组的运用
3, 共用体的运用
4, 结构体指针的运用
姓名: 魏志远 实验地点: 教学楼 514 教室 实验时间: 6.26
一, 实验目的与要求
(1) 掌握结构体类型说明和结构体类型变量, 数组, 指针的定义方法及使用.
(2) 学会引用结构体中的成员.
(3) 掌握利用指向结构体的指针成员构成链表的基本算法.
(4) 了解联合体类型和枚举类型的说明, 其变量的定义及赋初值的方法.
(5) 了解联合类型变量中各成员的存储结构, 学会引用各成员中的数据.
(6) 学习正确引用枚举类型常量, 了解如何对枚举类型变量进行操作.
二, 实验内容
9.3.1 结构体变量的运用
1. 问题的简单描述: 问题的简单描述: 试利用结构体类型描述年, 月, 日, 输入一个日期, 统计日期是本年度第多少天.
2. 流程图:
3. 实验代码:
- #include<stdio.h>
- main()
- { struct date
- {int day;
- int month;
- int year;
- }a;
- int i,days=0;
- 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;
- printf("%d 年 %d 月 %d 日是该年的第 %d 天",a.year,a.month,a.day,days);
- }
运行结果
4. 问题分析: 无
9.3.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[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);
- }
运行结果:
4. 问题分析: 开始没注意到比较候选人名字要用 strcmp 比较, 所以不知道如何比较, 后查验得知.
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];
- main()
- { int i;
- for(i=0;i<2;i++)
- {
- scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);
- if(person[i].job=='s')
- scanf("%d",&person[i].category.classes);
- else if(person[i].job=='t')
- scanf("%s",&person[i].category.position);
- else
- { printf("input error!");
- abort();
- }
- }
- printf("\n");
- printf("编号 姓名 职业 班级 / 职务 \ n");
- for(i=0;i<2;i++)
- if(person[i].job=='s')
- printf("%d\t%s\t%c\t%d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes);
- else
- printf("%d\t%s\t%c\t%s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);
- }
运行结果:
4. 问题分析: 按照书上所写 * name, 一直显示错误, 后老师说用 name[10], 便得到了结果.
9.3.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",n);
- }
运行结果:
4. 问题分析: 流程图看起来比较复杂, 但是代码大部分都有, 基本只要按照格式来就行, 但是自己设计流程就不会.
三, 实验小结
1, 书上的代码也会存在错误, 所以要求我们熟练理解和掌握各个知识代码的意义, 这样就能发现问题并解决.
2, 对于自己看一道题目, 自己去设计流程感觉有很大困难.
来源: http://www.bubuko.com/infodetail-3109175.html