第九章結構體與共用體實驗報告


C程序實驗報告

姓名:韋小聞     實驗地點:第一教學樓514教室     實驗時間:6月26日

實驗項目

1、 結構體變量的應用

2 、結構體數組的應用

3 、共用體的應用

4 、結構體指針的應用

一、實驗目的與要

1、結構體變量的應用

定義結構體類型struct date,它含有年、月、日3個成員;

定義struct date類型的變量,並從鍵盤輸入初值;

利用循環語句,計算天數;

利用分支結構,判斷閏年。

2、結構體數組的應用

定義候選人struct person結構體數組,含有姓名、得票數兩個成員

定義struct person結構體數組,人數自定,初始票數為0;

利用循環輸入候選人名字,該人員票數加1;

輸入的候選人不是規定的候選人時,相當於廢票,不累計。

3、共用體的應用

定義結構體類型,其成員有編號、姓名、職業和班級(或職務);

定義該結構體類型的數組,可有若干個數組元素;

利用該循環語句輸入每條記錄的數據,若該記錄的職業為‘s’,則該記錄是學生,輸入該學生的班級;若該記錄的職業是’t‘,則該記錄是教師的,輸入該教師的職務;

根據記錄的職業來判斷,使用哪個printf()語句輸出記錄。

4、結構體指針的應用

定義結構體類型,其成員有人員編號、下一人員編號(地址);

定義該結構體類型的數組,可有n個數組元素;

n個人圍成一圈,可以考慮用結構體數組元素中的“下一人員編號”來實現,但最后一個元素的“下一人員編號”指向第一個。

二、實驗內容

9.3.1 結構體變量的應用

問題描述:試利用結構體類型描述年、月、日,輸入一個日期,統計該日期是本年度第多少天。

流程圖如下:

實驗代碼:

#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)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;
     printf("%d年%d月%d日是該年的第%d天",a.year,a.month,a.day,days); 
}

實驗結果:

問題分析:這道題我開始的時候一直多一天,后來定義的時候讓days的初始值為0,結果才正確。

9.3.2 結構體數組的應用

問題描述:在選舉中,假設有6位候選人,有10個人參加投票(只能對一位候選人投票)。用結構體數組統計各候選人的得票數。

流程圖如下:

實驗代碼:

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

 實驗結果:

問題分析:這道題我for循環少了大括號,結果一直是錯的;要引用strcmp()比較函數進行比較。

9.3.3 共用體的應用

問題描述:編寫程序填寫表格,從鍵盤輸入學生和教師的信息,若是學生,則班級/職稱欄填入班級;若是教師,則班級/職稱欄填入職稱。

流程圖如下:

實驗代碼:

#include<stdio.h>
#include<stdlib.h>
struct
{
    int number;
    char name[20];
    char job;
    union
    {
        int classes;
        char position[10];
    }categoty;
}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].categoty.classes);
            }
        else if(person[i].job=='t')
            {
            printf("請輸入教師職稱:");
            scanf("%s",&person[i].categoty.position);
            }
        else
        {
            printf("Input error!");
            abort();
        }
    }
    printf("\n");
    printf("編號\t姓名\t職業\t班級/職務\n");
    for(i=0;i<2;i++)
        {
            if(person[i].job=='s')
              printf("%d\t%s\t%c\t%d\n",person[i].number,person[i].name,person[i].job,person[i].categoty.classes);    
            else
              printf("%d\t%s\t%c\t%s\n",person[i].number,person[i].name,person[i].job,person[i].categoty.position);
        }
}

實驗結果:

問題分析:這道題的示例輸入與給出的實驗代碼在輸入的編號、姓名、職業的順序中不是對應的,導致一開始一直運行錯誤。

9.3.4結構體指針的應用

問題描述:n個人圍成一圈,從第s個人開始按順時針1,2,3,……,m的順序報數,數到m的人出圈,然后從出圈的下一個人開始重復此過程,輸出所有出圈人的順序。n,s,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);
 }

 實驗結果:

問題分析:無。

三、實驗小結

1、這節實驗課進行的是關於結構體和共用體的一些相關實驗,讓我對結構體類型變量、數組、指針的定義有了進一步的了解,學會了怎么引用結構體中的成員。

2、結構體中數組變量的輸入可以不使用‘&’取地址運算符;函數定義的嵌套使用,在輸出的時候要明確好結構體名字逐級輸入。

3、要注意for循環的大括號,括號里面要包括哪些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM