结构体与共用体
Posted wangyuqing1126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体与共用体相关的知识,希望对你有一定的参考价值。
C程序设计实验报告
实验项目:构造数据类型实验
姓名:王雨晴 实验地点:514实验室 实验时间:2019年6月26日
一、本章要点(对本章知识点进行归纳,含个人学习心得)
- 结构体名为任何合法的标识符,建议用具有一定意义的单词或组合作为结构体名。
- 虽然成员的类型定义形式同简单变量,但不能直接使用。
- 结构体变量的定义方式有多种。结构体变量成员的引用要很熟练的使用。
- 共用体是把不同类型的数据项组成一个整体,这些不同类型的数组项在内存中所占用的起始单元相同的,共用体变量的大小是其最大成员的大小.
学习心得:C语言的学习让我更深的体会到了上课听懂跟自己写实验是不一样的,老师上课是把知识点捏碎了来教给我们,我们自己做实验的时候就要靠自己把知识点拼起来,实验课堂上,看到实验题第一就是把书上代码敲上去,这样一点效果都没有,理论我们应该自己从头到尾把算法想明白,可是每当看到书上有,就.....就这样我们的实验编程题做成了编程题填空,这样就效果没有那么好了。要给自己C语言学习打分的话,我也只能给自己50分,及不了格,因为自己的学习还是不是很主动,加上前面说的,给自己50已经很高了~~
二、实验内容
实验练习一:9.3.1结构体变量的应用
1、问题的简单描述:利用结构体类型描述年月日,输入一个日期,统计该日期是本年度第多少天。
流程图:
2、实验代码:
#include<stdio.h>
main()
struct date
int year;
int month;
int day;
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=days+a.day;//加上输入日期的天数//
printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days);
3、问题分析:
if (i==1||i==3||i==5||i==7||i==8||i==10) 这一句代码让我熬夜熬到12.30,我第一次敲的是if(i==1||3||5||7||8||10||),我主观意识的中文表达,如果i是1、3、5、7、8、10,就让我出现了这样的表达式,结果程序没有报错,就是运行结果出了问题,好在在一番挣扎以后发现了错误,第一个题刚上手的时候还真的觉得特难,不过不懂得边看看书,也就明白了。
运行结果:
实验练习二:9.3.2数据体数组应用
1、问题的简单描述:选举进行选票,包含候选人姓名、获得票数、假设6位候选人,有10个参加投票,用结构体数组进行统计各候选人的票数。
流程图:
2实验代码:
#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 );
3、问题分析:
a[j].count++;//输入名字与候选人一至,候选人票数加一// 这一句代码,我看着流程图,说输入姓名与候选人姓名一致,j++,自己也还不适应数据变量成员的引用,就没反应过来,后来看着程序运行结果不对,检查以后就改了过来。
运行结果:
实验练习三:9.3.3共用体的应用
1、问题描述:编写程序填写表格,从键盘输入学生和教师信息,若是学生,则班级/职务栏填入班级,若是老师,则填入职务。
流程图:
2、实验代码
#include <stdio.h>
#include <stdlib.h>
struct
int number;
char name[20];//定义一个name数组//
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')
printf("请输入相应的班级/职务: ");
scanf("%d",&person[i].category.classes);
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%s\\t\\t%c\\t\\t%d\\n",person[i].number,person[i].name,person[i].job,
person[i].category.classes);
else
printf("%d\\t\\t%s\\t\\t%c\\t\\t%s\\n",person[i].number,person[i].name,person[i].job,
person[i].category.position);
3、问题分析
char name[20];//定义一个name数组// ,这个题就是卡在了这里书上给的这里是定义了一个name指针,然后我们都没去仔细思考以至于班上同学都卡了
运行结果:
实验练习四:9.4.4
1、问题描述:n个人围成一圈,从第s个人开始按顺时针1,2,3...,m的顺序报数,数到m的人出圈,然后从下一个人开始重复此过程,输出所有出圈人的顺序。nsm从键盘输入。
流程图:
2、实验代码
#include <stdio.h>
#define N 10
struct child
int no;
int next;
;
struct child link[10];
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 (count<n-1)//出圈数<围圈数-1//
i=0;
while(i!=m)
h=link[h].next;
if(link[h].no!=0)
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[i].no); //最后留在圈中人数//
3、问题分析
定义结构体数组link[N]时,N可以定义稍微大些,而实际的围圈人数n比N小。
运行结果:
三、实验小结
收获:对结构体变量更加熟悉,更加了解了。定义一个结构体,结构体里包含着成员无,论是基本数据类型还是数组都仅仅描述了事物某一方面的特性, 但是, 一种事物往往具有多方面的属性, 如一个同学有学号, 姓名, 性别, 年龄等属性.。所有共用体在同一时刻只能有一个值, 它属于某一数据成员, 不过其它成员会共享这个值, 只是会转换成这些成员的数据类型 ,共用体变量的大小是其最大成员的大小.
不足:一开始对结构体的运用不够熟悉,要注意同结构类型变量一样,结构体数组元素不能作为一个整体来输入或输出,只能以单个成员为对象进行输入和输出,因为每个结构体数组元素都是一个结构体类型变量。
以上是关于结构体与共用体的主要内容,如果未能解决你的问题,请参考以下文章