第九章實驗報告(構造數據類型)

C語言程序與設計實驗報告

實驗項目:

  • 結構體變量的應用算法

  • 結構體數組的應用數組

  • 共用體的應用函數

  • 結構體指針的應用學習

姓名:徐溢璠     實驗地點: 514實驗室       實驗時間:2019年6月26日

1、實驗目的與要求

一、掌握結構體類型說明和結構體類型變量、數組、指針的定義方法及使用。
二、學會引用結構體中的成員。
三、掌握利用指向結構體的指針成員構成鏈表的基本算法。
四、瞭解聯合體類型和枚舉類型的說明、其變量的定義及賦初值的方法。
五、瞭解聯合類型變量中各成員的存儲結構,學會引用各成員中的數據。
六、學習正確引用枚舉類型常量,瞭解如何對枚舉類型變量進行操做。spa

2、實驗內容

9.2.1 結構體變量的應用

一、簡單問題描述:試利用結構體類型描述年、月、日,輸入一個日期,統計該日期是本年度第多少天。程序流程圖以下:設計

二、實驗代碼3d


#include<stdio.h>
 main()
{
    struct date
    {
        int year;
        int month;
        int day;
    };
    struct date 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||i==12)
        days+=31;
        else if(i==4||i==6||i==9||i==11)
        days+=30;
        else if(a.year/4==0&&a.year%100!=0||a.year%400==0)
        days+=29;
        else   
        days+=28;       
    }
    days+=a.day+1;
    printf("%d年%d月%d日是該年的第%d天",a.year,a.month,a.day,days);
}

三、問題分析指針

問題:code

解決辦法:將blog

if(i==1||3||5||7||8||10||12)

days+=31;

else if(i==4||6||9||11)

days+=30;

改成

if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)

days+=31;

else if(i==4||i==6||i==9||i==11)

days+=30;

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

 

三、問題分析

問題:剛開始並不知道「若第j個候選人與輸入的名字相同,則第j位加一票」怎麼用程序代碼表達。

解決辦法:百度,用一個函數「strcmp」。

9.3.3   共用體的應用

一、簡單問題描述:若將教師和學生的數據放在統一表格中。教師的數據包括編號,姓名,職業和職務,學生的數據包括編號,姓名,職業和班級。試編寫程序填寫表格。程序流程圖以下所示:

二、實驗代碼

#include<stdio.h>
#include<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++)
    {
        printf("請輸入編號、姓名、職業:");
        scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);
        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();
        }
    }
    printf("\n");
    printf("編號\t\t姓名\t\t職業\t\t班級/職務\n");
     for(i=0;i<2;i++)
    {
        if(person[i].job=='s')
            {
                printf("%d\t\t%s\t\t%c\t\t%d\n",person[i].number,person[i].name,person[i].job,person[i].category.classes);
            }
        else
            {
                printf("%d\t\t%s\t\t%c\t\t%s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);    
            }
    }
}

三、問題分析

問題:不管怎樣輸入都是如圖所示:

解決辦法: scanf("%d%s%s",&person[i].number,&person[i].name,&person[i].job);改成scanf("%s%d%s",&person[i].name,&person[i].number,&person[i].job);由於我輸入的順序和字符類型不一樣。

9.3.4  結構體指針的應用

一、簡單問題描述:n我的圍成一圈,從第s我的開始按順時鐘1,2,3……,m,的順序報數,數到m的人出圈,而後從出圈的下一我的開始重複此過程,輸出全部出圈人的順序。程序流程圖以下所示:

二、實驗代碼

#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)
    {
        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、實驗小結

收穫:

一、C語言中,要用if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)表示或者,而不是用if(i==1||3||5||7||8||10||12)表示。

二、strcmp(s,n)用於比較字符串s和n。

三、輸入的內容要和scanf中的字符型保持一致,不然沒法達到結果。

四、\t爲輸出空格。

相關文章
相關標籤/搜索