zoukankan      html  css  js  c++  java
  • 第九章结构体与公用体

    C程序设计实验报告

    实验练习:

      9.3.1、结构体变量的应用

      9.3.2、结构提数组的应用

      9.3.3、共用体的应用

      9.3.4、结构提指针的应用

    姓名:王治林    实验地点:教学楼514教室     实验时间:6月26日

    9.3.1、结构体变量的应用

    ● 定义结构体类型struct date,它含有年、月、日3个成员;
    ● 定义struct date类型的变量,并从键盘输入初值
    ● 利用循环语句,计算天数
    ● 利用分支语句,判断闰年

    9.3.2、结构提数组的应用

    ● 定义候选人struct person结构体,含有姓名、得票数两个成员;
    ● 定义struct person结构体数组,人数自定,初始得票数为0
    ● 利用循环输入候选人名字,该人员票数加0
    ● 输入的候选人不是规定候选人时,相当于废票,不累计

    9.3.3、共用体的应用

    ● 定义结构体类型,其他成员有编号、姓名、职业和班级(或职务)
    ●定义该结构体类型的数组,可有若干数组元素
    ●利用循环语句输入每条记录的数据,若该记录的职业为“s”,则该记录是学生的,输入该学生的班级;若该记录的职业为“t”,则该记录是教师的,输入该教师的职务
    ●根据记录的职业来判断,使用哪个printf()语句输出记录

    9.3.4、结构提指针的应用

    ● 定义结构体类型,其成员有人员编号(地址)
    ●定义该结构体类型的数组,可有n个数组元素
    ●n个人围成一圈,可以考虑用结构体数组元素中的“下一成员编号”来实现,但是最后一个元素的“下一人员编号”指向第一个

     二、实验内容

    1、实验练习(9.3.1):

    1.问题的简单描述:

    试利用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第几天。算法描述如图所示:

    2.实验代码

    #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);
    } 
    

      3.实验效果:

    4.实验分析:发现自己的天数少了一天,然后同学帮我看发现我没减一天才改正过来。

    2、结构体数组的应用

    问题的简单描述:在选举中,假设有6位候选人,有10个人参加投票(只能对一位候选人投票),用结构体数组统计各候选人的得票数。算法描述如图:

    实验代码:

    #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);
        }
    }
    

      实验效果:

    实验分析:主要的问题呢还是那个strcmp()函数,怎样才能达到目的。要对字符串进行长度比较。只有解决这个才能运行。

    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.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		",person[i].number);
                    printf("%s		",person[i].name);
                    printf("%c		",person[i].job);
                    printf("%d
    ",person[i].category.classes);
                }
            else
                {
                    printf("%d		",person[i].number);
                    printf("%s		",person[i].name);
                    printf("%c		",person[i].job);
                    printf("%s
    ",person[i].category.position);     
                }
        }
    }
    

      实验效果:

    实验分析:name需要使用数组,不然程序会直接异常关闭。发现在它结构体定义的时候,name定义成了指针,将name定义成数组就可以得到正确结果。

    4、结构体指针的应用

    问题的简单描述:n个人围成一圈,从第s个人开始按顺时钟1,2,3.....,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输入所有出圈人的顺序。n,s,m从键盘输入。算法描述如下:

    实验代码:

    #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(count<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[i].no);
        }
    }
    

      实验效果:

    实验分析:最后输出留在圈中人数时,要使用count才可以,发现结果总是出错,最后一个数字总是显示为8,然后改为link[i].no结果才正确

    实验总结

    实验里还是很多不能通过自己一个人解决,还是会经常问同学才能解决。还有就是缺乏自主思考能力,只会按照固有的想法想。还有在函数方面比较弱。

  • 相关阅读:
    使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
    SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
    SAP UI5 标准应用的多语言支持
    微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
    SAP Fiori Elements 应用里的 Title 显示的内容是从哪里来的
    本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?
    如何在 Cypress 测试代码中屏蔽(Suppress)来自应用代码报出的错误消息
    教你一招:让集群慢节点无处可藏
    应用架构步入“无服务器”时代 Serverless技术迎来新发展
    MySQL数据库事务隔离性的实现
  • 原文地址:https://www.cnblogs.com/wangzhilin/p/11110699.html
Copyright © 2011-2022 走看看