第九章实验报告

C程序设计实验报告

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

姓名:林胜臣  实验地点:第一教学楼514教室   实验时间:2018年6月26日

一、实验目的与要求

1、掌握结构体类型说明和结构体变量、数组、指针的定义方法及使用。
2、学会引用结构体中成员。
3、掌握利用指向结构体的指针成员构成链表的基本算法。
4、了解联合体类型和枚举类型的说明、其变量的定义及赋初始值的方法。
5、了解联合体类型变量中成员的储存结构,学会引用各成员中的数据。
6、学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作。

二、实验内容

1、实验练习:结构体变量的应用(9.3.1)

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

2实验流程图:

 

3实验代码:

#include<stdio.h> 
main()
{
    struct data
    {
        int year;
        int month;
        int day;
    }a;
    int i,days=0;
    printf("请输入年,月,日:\n");
    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); 
 } 

 

结果:

 

分析:if语句中i=1,3,5,7,8,10应该每个都用或语句。

2、实验练习:结构体数组的应用(9.3.2)

1问题的简单描述:

2实验流程图:

 

3实验代码:

#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+=1; 
    }
    for(j=0;j<6;j++)
    printf("%s:%d\n",a[j].name,a[j].count); 
} 

 

结果:

 

分析:在此题用到了strcmp函数,使输入的名字与结构体数组里的名字进行对比,若一样就会返回一个值:0,所以只要判断返回值是否为0即可做出此题。

3、实验练习:公用体的应用(9.3.3)

1问题的简单描述:

2实验流程图:

 

3实验代码:

#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("请输入班级\n"); 
            scanf("%d",&person[i].category.classes);
        }
            
        else if(person[i].job=='t')
        {
            printf("请输入职业\n");
            scanf("%s",person[i].category.position);
        }
        else
            { 
              printf("input error!");
              abort();
              return 0;
            }
     } 
     printf("\n");
     printf("编号   姓名   职业   班级/职务\n");
     for(i=0;i<2;i++)
     {
          if(person[i].job=='s')
             printf("%d  %s  %c   %d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes);
         else
            printf("%d  %s  %c   %s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);

     }
    }

 

结果:

 

分析:根据书本上的代码没有成功输出,与同学讨论后结构体中的char *name,在输入时一直没有读取值,改成数组才能读取。

4、实验练习:结构体指针的应用(9.3.4)

1问题的简单描述:

2实验流程图:

 

3实验代码:

#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("出圈顺序为:\n");
     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);
 } 

 

结果:

 

分析:问题无。

三、实验小结

了解strcmp()函数的用法:

功能:比较字符串a和b。
  函数形式:strcmp(a,b)

       用法:
  当a<b时,返回值<0
  当a=b时,返回值=0
  当a>b时,返回值>0。

  退出程序用abort函数。

  书本上也会有错误,有时要用到扎实的基础来改正书本上的一些错误。

posted @ 2019-06-30 17:04  遗失~  阅读(219)  评论(0编辑  收藏  举报