zoukankan      html  css  js  c++  java
  • 第九章 构造数据类型实验

    第九章 构造数据类型实验

    姓名:周萌    实验地点:514教室    实验时间:4.30


     实验项目:

    • 9.3.1.试利用结构体类型描述年、月、日,输入一个日期,统计该日期是本年度第多少天。

    • 9.3.2. 在选举中进行投票,包含候选人姓名、得票数,假设有多为候选人,用结构体数组统计各候选人的得票数。

    • 9.3.3. 若将教师和学生的数据放在同一表格中。教师的数据包括编号、姓名、职业和职务,学生的数据包括编号、姓名、职业和班级。试编写程序填写表格。

    • 9.3.4.n个人围成一圈,从第s个人开始按顺时针1,2,3,···,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输入所有出圈人的顺序。

    二、实验内容

    1、结构体变量的应用

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

    • 实验代码:
     1 #include<stdio.h>
     2 main()
     3 { struct date
     4     {
     5     int year;
     6     int month;
     7     int day; 
     8     };
     9  struct date a;
    10     int i;
    11     int days;
    12     printf("请输入年、月、日:");
    13     scanf("%d%d%d",&a.year,&a.month,&a.day);
    14     for(i=1;i<a.month;i++)
    15     {
    16         if(i==1||i==3||i==5||i==7||i==8||i==10)
    17         days+=31;
    18         else if(i==4||i==6||i==9||i==11)
    19         days+=30;
    20         else if((a.year%4==0&&a.year%100!=0)||a.year==400)
    21         days+=29;
    22         else days+=28;
    23     }
    24     days+=a.day;
    25     printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days-1);
    26 }

    运行结果:

    • 问题分析:最后的days要减一才能得出真实答案。

    2、结构体数组的应用

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

    • 实验代码
     1 #include<stdio.h>
     2 #include<string.h>
     3 struct person
     4 {
     5     char name[20];
     6     int count;
     7 }a[6]={"zhang",0,"li",0,"wang",0,"zhao",0,"liu",0,"zhu",0};
     8 main()
     9 {
    10     int i,j;
    11     char abc[20];
    12     for(i=1;i<=10;i++)
    13     {
    14         printf("请输入候选人的名字:");
    15         scanf("%s",abc);    
    16         for(j=0;j<6;j++)
    17             {
    18                 if(strcmp(a[j].name,abc)==0) a[j].count++;
    19             }
    20     }
    21     for(j=0;j<6;j++)
    22     {
    23         printf("%s:%d
    ",a[j].name,a[j].count);
    24     }    
    25 }

    运行结果

    • 问题分析:在比较字符串时应该应用(strcmp(a[j].name,abc)形式才能正常编译,不然会报错。

    3、共用体的应用

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

    • 实验代码:
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 struct
     4 {
     5     int number;
     6     char name[20];
     7     char job;
     8     union
     9     {
    10         int classes;
    11         char position[10];
    12     }categoty;
    13 }person[2];
    14 main()
    15 {
    16     int i;
    17     for(i=0;i<2;i++)
    18     {
    19         printf("请输入姓名、编号、职业:");
    20         scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);
    21         if(person[i].job=='s')
    22             {
    23             printf("请输入班级:");
    24             scanf("%d",&person[i].categoty.classes);
    25             }
    26         else if(person[i].job=='t')
    27             {
    28             printf("请输入教师职称:");
    29             scanf("%s",&person[i].categoty.position);
    30             }
    31         else
    32         {
    33             printf("Input error!");
    34             abort();
    35         }
    36     }
    37     printf("
    ");
    38     printf("编号	姓名	职业	班级/职务
    ");
    39     for(i=0;i<2;i++)
    40         {
    41             if(person[i].job=='s')
    42               printf("%d	%s	%c	%d
    ",person[i].number,person[i].name,person[i].job,person[i].categoty.classes);    
    43             else
    44               printf("%d	%s	%c	%s
    ",person[i].number,person[i].name,person[i].job,person[i].categoty.position);
    45         }
    46 }

    运行结果:

    • 问题分析:在定义结构体内元素时,name需要使用数组,不然程序会直接异常关闭。

    4、结构体指针的应用

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

    • 实验代码:
     1 #include<stdio.h>
     2 #define N 10
     3 struct child
     4 {
     5     int no;
     6     int next;
     7 };
     8 struct child link[N];
     9 main()
    10 {
    11     int i,n,m,s,count,h;
    12     printf("输入围圈人数,出圈报数,开始报数位置:");
    13     scanf("%d%d%d",&n,&m,&s);
    14     for(i=1;i<=n;i++)
    15     {
    16         if(i==n)
    17             link[i].next=1;
    18         else
    19             link[i].next=i+1;
    20         link[i].no=i;
    21     }
    22     count=0;
    23     if(s==1)
    24         h=n;
    25     else 
    26         {
    27             h=s-1;
    28         }
    29     printf("出圈顺序为:");
    30     while(count<n-1)
    31     {
    32         i=0;
    33         while(i!=m)
    34         {
    35             h=link[h].next;
    36             if(link[h].no)
    37                 i++;
    38         }
    39         printf("%d, ",link[h].no);
    40         link[h].no=0;
    41         count++;
    42     } 
    43     for(i=1;i<=n;i++)
    44     {
    45         if(link[i].no!=0)
    46         printf("%d",link[i].no);
    47     }
    48 }

    运行结果:

    • 问题分析:最后输出留在圈中人数时,使用了count,发现结果总是出错,最后一个数字总是显示为8,最后改为link[i].no结果才正确。

    三、实验小结

    1、太相信书上所言,导致的错误不计其数,不能只相信书上,有时候还要加入自己的思考。

    2、结构体和共用体变量一定要熟练运用,并且知道他们各自依靠何种方式存储。


  • 相关阅读:
    用TextKit实现表情混排
    IOS类似9.png
    iphone 弹出键盘,文本框自动向上移动。
    IOS截取部分图片
    IOS给图片增加水印(图片、文字)
    iOS界面设计切图小结
    table tr th td thead tbody tfoot
    怎样让table没有边框
    margin、padding,border默认值
    Java 随机数
  • 原文地址:https://www.cnblogs.com/AwakenZed/p/11107453.html
Copyright © 2011-2022 走看看