第九章实验报告

C程序设计实验报告

实验项目:构造数据类型实验

姓名:罗子健 实验地点:物联网实验室 实验时间:2019年6月26日

一、实验目的与要求

(1)掌握结构体类型说明和结构体类型变量、数组、指针的定义方法及使用。

(2)学会引用结构体中的成员。

(3)掌握利用指向结构体的指针成员构成链表的基本算法。

(4)了解联合体类型和枚举类型的说明、其变量的定义及赋初值的方法。

(5)了解联合类型变量中各成员的存储结构,学会引用各成员中的数据。

(6)学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作。


 

二、实验内容

9.3.1 结构体变量的应用

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

2、实验流程图、代码和结果:

 

 1 /*ex9_1*/
 2 #include<stdio.h>
 3 main()
 4 { struct date
 5  { int year;
 6    int month;
 7    int day;/*含有年、月、日、3个成员*/ }
 8    a;/*定义结构体变量a*/
 9    int i,days;/*定义其他变量*/
10  printf("输入年、月、日:");/*提示“输入年、月、日”*/
11  scanf("%d%d%d",&a.year,&a.month,&a.day);/*输入“年、月、日”*/
12   for(i=1;i<a.month;i++)
13   { if (i==1||i==3||i==5||i==7||i==8||i==10) days+=31;
14     else if(i==4||i==6||i==9||i==11) days+=30;
15     else if(a.year%100!=0&&a.year%4==0||a.year%400==0) days+=29;
16         else days+=28;} 
17     days+=a.day-1;
18     printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days);/*输出结果*/ 
19 }

 

3、问题分析:day要进行-1,不然会比实际天数多1。

9.3.2 结构体数组的应用

1、问题的简单描述:

2、实验流程图、代码和结果:

 

 1 /*ex9_2.c*/
 2 #include "stdio.h"
 3 #include<string.h>
 4 struct person
 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 { int i,j; char abc[20];
10   for(i=1;i<=10;i++)
11   { printf("输入候选人姓名:");/*提示“输入候选人名字”*/
12       scanf("%s",abc); /*输入候选人名字*/
13    for(j=0;j<6;j++)
14    if(strcmp(abc,a[j].name)==0)
15    a[j].count++;};
16    for(j=0;j<6;j++)
17    printf("%s:%d\n",a[j].name,a[j].count);/*输入各候选人的名字和得票数*/ 
18 }

 

3、问题分析:用到了strcmp比较函数进行比较来判断该候选人的票数是否加一

9.3.3 共用体的应用

1、问题的简单描述:

2、实验流程图、代码和结果:

 

 1 /*ex9_3.c*/
 2 #include "stdio.h"
 3 #include<stdlib.h>
 4 struct
 5 {    int number;
 6     char name[99];
 7     char job;
 8     union
 9     {    int classes;
10          char position[10];    
11     }category;
12 }person[2];
13 main()
14 {    int i;
15     for(i=0;i<2;i++)
16     {    scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);/*输入某人的编号、姓名、职业*/ 
17         if(person[i].job=='s')
18             scanf("%d",&person[i].category.classes);
19         else if(person[i].job=='t') 
20             scanf("%s",&person[i].category.position);/*输入教师的职称*/
21         else
22         {    printf("input error!");
23             abort();/*若输入错误,则退出程序*/ 
24         } 
25     }
26     printf("\n");
27     printf("编号    姓名    职业    班级/职务\n");
28         for(i=0;i<2;i++)
29             if(person[i].job=='s')
30                 printf("%d    %s    %c    %d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes);/*输出学生的记录*/
31             else
32                 printf("%d    %s    %c    %s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);
33 }

 

3、问题分析:若要调用abort()函数退出程序,就要有包含stdlib.h的头文件。

9.3.4 结构体指针的应用

1、问题的简单描述:

2、实验流程图、代码和结果:

 

 1 /*ex9_4.c*/
 2 #include<stdio.h>
 3 #define N 10        /*最多围圈人数*/
 4 struct child
 5 {
 6     int no;            /*人员编号*/ 
 7     int next;        /*下一人员编号*/
 8 } ;
 9 struct child link[99];        /*定义结构体数组link[N],描述所有人员*/
10 main()
11 {
12     int i,n,m,s,count,h;        /*定义变量*/
13     printf("输入围圈人数,出圈人数,开始报数位置:");
14     scanf("%d%d%d",&n,&m,&s);/* 输入围圈人数n,出圈人数m,开始报数位置s*/
15     for(i=1;i<=n;i++)
16     {
17         if(i==n)
18             link[i].next=1;
19         else
20             link[i].next=i+1;
21         link[i].no=i;
22     }
23     count=0;
24     if(s==1)h=n;else h=s-1;
25     printf("出圈顺序为:");
26     while(count<n-1)/*出圈人数<围圈人数-1*/ 
27     {
28         i=0;
29         while(i!=m)
30         {
31             h=link[h].next;
32             if(link[h].no)
33                 i++;
34         }
35         printf("%d, ",link[h].no);
36         link[h].no=0;
37         count++;
38     }
39     for(i=1;i<=n;i++)
40     if(link[i].no!=0)
41     printf("%d",link[i].no);/*输出最后留在圈中的人数*/ 
42 } 

3、问题分析:定义数组link[N],N要定义大一些,N要大于n。


 

三、实验小结(在本次实验中收获与不足)

要调用abort()函数退出程序,就要有包含stdlib.h的头文件。不然就不能中止。

posted @ 2019-06-30 15:20  微风未起  阅读(204)  评论(0编辑  收藏  举报