码迷,mamicode.com
首页 > 其他好文 > 详细

第九章 结构体与共用体

时间:2019-06-30 18:40:16      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:mamicode   流程图   next   +=   mon   老师   职业   can   语言   

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小。
运行结果:
技术图片

三、实验小结

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

第九章 结构体与共用体

标签:mamicode   流程图   next   +=   mon   老师   职业   can   语言   

原文地址:https://www.cnblogs.com/wangyuqing1126/p/11108956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!