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循環的大括號,括號里面要包括哪些。