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

    C程序设计实验报告

    姓名:欧阳思健 实验地点: 514实验室 实验时间:2019年6月26日

    实验项目:

    9.3.1 结构体变量的应用
    9.3.2 结构体数组的应用
    9.3.3 共用体的应用
    9.3.4 结构体指针的应用

    一、实验目的与要求

    9.3.1 结构体变量的应用
    • 定义结构体类型struct date,它含有年、月、日3个成员;
    • 定义struct date类型的变量,并从键盘输入初值;
    • 利用循环语句,计算天数;
    • 利用分支结构,判断闰年。
    9.3.2 结构体数组的应用
    • 定义候选人struct person结构体数组,含有姓名、得票数两个成员;
    • 定义struct person结构体数组,人数自定,初始票数为0;
    • 利用循环输入候选人名字,该人员票数加1;
    • 输入的候选人不是规定的候选人时,相当于废票,不累计。
    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,month,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)
            {
                days+=29;
            }   
            else 
            {
                days+=28;
            }
         } 
        days+=a.day;
        printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days);
    }

    3.运行结果

    4、问题分析:这道题刚一直都没有将days定义为0天,导致输出结果总会多一天,而且,一直不是很明白为什么一定要定义days为0.

    2、实验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[i]);
    for(j=0;j<6;j++)
    {    
    if(strcmp(a[j].name,&abc[i])==0)
    a[j].count++;     
    }    
    }
    for(j=0;j<6;j++)
    {
    printf("%s:%d
    ",a[j].name,a[j].count);    
    }    
    }

    3.运行结果

    4.问题分析:一直不知道比较实用strcmp函数进行比较,对没有用过的函数没有一点办法。

    3、实验9.3.3

    1、问题的简单描述:编写程序填写表格。从键盘输入学生和教师的信息,若是学生,则班级职务栏填写班级;若是教师,则班级职务栏填写职称。

    流程图如图所示:

    2.实验代码:

    #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++)
        {
            fflush(stdin);
            scanf("%c,%d,%s",&person[i].job,&person[i].number,person[i].name );
            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();
                  return 0;
                }
         } 
         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.运行结果

    4.问题分析:这个实验要把*name改成name【10】。

    4、实验9.3.4

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

    流程图如图所示:

    2.实验代码:

    #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",link[h].next);
     } 

    3.运行结果

    没有问题

    实验小结:这章节重在对各种数据类型的理解,熟悉运用,并且能够掌握,如果不能理解,这就做不出题目。

  • 相关阅读:
    [NOI2018]归程 kruskal重构树
    [NOIP2017]逛公园 最短路图 拓扑序DP
    [bzoj4398] 福慧双修 最短路 二进制分组
    【HDOJ】【4405】Aeroplane chess飞行棋
    【ZOJ】【3329】One Person Game
    【POJ】【2096】Collecting Bugs
    【BZOJ】【3093】【FDU校赛2012】A Famous Game
    【BZOJ】【3143】【HNOI2013】游走
    【UVA】【10828】随机程序
    【UVA】【11762】Race to 1(得到1)
  • 原文地址:https://www.cnblogs.com/ouyangsijian/p/11111617.html
Copyright © 2011-2022 走看看