• 第九章 结构体与共用体


    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 (i1||i3||i5||i7||i8||i10) 这一句代码让我熬夜熬到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
    ",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("
    ");
    	printf("编号		姓名		职业		班级/职务
    ");
    	for(i=0;i<2;i++)
    	    if(person[i].job=='s')
    	       printf("%d		%s		%c		%d
    ",person[i].number,person[i].name,person[i].job,
    		   person[i].category.classes);
    	    else
    	       printf("%d		%s		%c		%s
    ",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小。
    运行结果:

    三、实验小结

    收获:对结构体变量更加熟悉,更加了解了。定义一个结构体,结构体里包含着成员无,论是基本数据类型还是数组都仅仅描述了事物某一方面的特性, 但是, 一种事物往往具有多方面的属性, 如一个同学有学号, 姓名, 性别, 年龄等属性.。所有共用体在同一时刻只能有一个值, 它属于某一数据成员, 不过其它成员会共享这个值, 只是会转换成这些成员的数据类型 ,共用体变量的大小是其最大成员的大小.
    不足:一开始对结构体的运用不够熟悉,要注意同结构类型变量一样,结构体数组元素不能作为一个整体来输入或输出,只能以单个成员为对象进行输入和输出,因为每个结构体数组元素都是一个结构体类型变量。

  • 相关阅读:
    Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.
    【Problem】xampp in ubuntu下命令行启动mysql报错: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
    余生,一定要找一个随时能和你聊天的人
    找个可以说话的人 不容易
    我们都应该找一个,可以一辈子陪自己说话的人
    windows下安装ubuntu
    Ubuntu 修改环境变量
    Ubuntu14.04如何备份和恢复系统
    deeplearning 源码收集
    Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明2
  • 原文地址:https://www.cnblogs.com/wangyuqing1126/p/11108956.html
Copyright © 2020-2023  润新知