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

    C程序设计实验报告

    实验项目:

    1、结构体变量的应用
    2、结构体数组的应用
    3、共用体的应用
    4、结构体指针的应用

    姓名:杨珺茹   实验地点:514       实验时间:2019.6.26

    一、本章要点

    9.3.1、结构体变量的应用

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

    9.3.2、结构提数组的应用

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

    9.3.3、共用体的应用

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

    9.3.4、结构提指针的应用

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

    二、实验内容

    9.3.1、实验练习:

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

    2实验代码:

    #include<stdio.h>
    main()
    {
        struct date
        {
            int year;
            int month;
            int days;
        };
        struct date a;
        int i,days;
        printf("输入年,月,日:");
        scanf("%d %d %d",&a.year,&a.month,&a.days);
        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%400==0||(a.year%4==0&&a.year %100!=0))
                days+=29;
            else days+=28;
        }
              days+=a.days-1;
            printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.days,days);        
    }

      

    3问题分析:

    .

    days=days+a.day,从1月1日开始算起,所以后面应该-1,否则输出的结果为87。

     

    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++;
            /*若第j个候选人名字与输入的名字相同,第j位候选人票数加1*/
      }
      for(j=0;j<6;j++)
           printf("%s:%d
    ",a[j].name,a[j].count);
    }

    3问题分析:

    本题运用了strcmp()函数,功能:用来比较两个字符串,基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。 

     

    9.3.3、实验练习:

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

    2实验代码:

    #include<stdio.h>
    #include<stdlib.h>//包含头文件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++)
        {
            scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);
            if(person[i].job=='s')
            {
                scanf("%d",&person[i].category.classes);
            }
            else if(person[i].job=='t')
            {
                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问题分析:

    制作表格我们可以用 来输出,如果用空格的话会导致数据不整齐。

    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(count<n-1)//出圈人数<围圈人数-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);
    }

    3问题分析:

    三、实验小结

    字符串比较的时候,用strcmp()函数进行比较。

    要有逻辑思维。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
    Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
    QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
  • 原文地址:https://www.cnblogs.com/YANG1116/p/11109686.html
Copyright © 2011-2022 走看看