第九章 结构体与共用体
生活随笔
收集整理的這篇文章主要介紹了
第九章 结构体与共用体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C程序設計實驗報告
姓名:歐陽思健 實驗地點: 514實驗室 實驗時間:2019年6月26日
實驗項目:
9.3.1 結構體變量的應用
9.3.2 結構體數組的應用
9.3.3 共用體的應用
9.3.4 結構體指針的應用
一、實驗目的與要求
9.3.1 結構體變量的應用
- 定義結構體類型struct date,它含有年、月、日3個成員;
- 定義struct date類型的變量,并從鍵盤輸入初值;
- 利用循環語句,計算天數;
- 利用分支結構,判斷閏年。
9.3.2 結構體數組的應用
- 定義候選人struct person結構體數組,含有姓名、得票數兩個成員;
- 定義struct person結構體數組,人數自定,初始票數為0;
- 利用循環輸入候選人名字,該人員票數加1;
- 輸入的候選人不是規定的候選人時,相當于廢票,不累計。
9.3.3 共用體的應用
- 定義結構體類型,其成員有編號、姓名、職業和班級(或職務);
- 定義該結構體類型的數組,可有若干個數組元素;
- 利用該循環語句輸入每條記錄的數據,若該記錄的職業為‘s’,則該記錄是學生,輸入該學生的班級;若該記錄的職業是’t‘,則該記錄是教師的,輸入該教師的職務;
- 根據記錄的職業來判斷,使用哪個printf()語句輸出記錄。
9.3.4 結構體指針的應用
- 定義結構體類型,其成員有人員編號、下一人員編號(地址);
- 定義該結構體類型的數組,可有n個數組元素;
- n個人圍成一圈,可以考慮用結構體數組元素中的“下一人員編號”來實現,但最后一個元素的“下一人員編號”指向第一個。
二、實驗內容
1、實驗9.3.1
1、問題的簡單描述:試利用結構體類型描述年、月、日,輸入一個日期,統計該日期是該年度第多少天。
流程圖如圖所示:
2、實驗代碼:
#include<stdio.h> main() {struct date{int year,month,day;}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){days+=29;} else {days+=28;}} days+=a.day;printf("%d年%d月%d日是該年的第%d天",a.year,a.month,a.day,days); }3.運行結果
4、問題分析:這道題剛一直都沒有將days定義為0天,導致輸出結果總會多一天,而且,一直不是很明白為什么一定要定義days為0.
2、實驗9.3.2
1、問題的簡單描述:在選舉中,假設有6位候選人,有10個人參加投票(只能對一位候選人投票),用結構體數據統計各候選人的得票數。
流程圖如圖所示:
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[i]); for(j=0;j<6;j++) { if(strcmp(a[j].name,&abc[i])==0) a[j].count++; } } for(j=0;j<6;j++) { printf("%s:%d\n",a[j].name,a[j].count); } }3.運行結果
4.問題分析:一直不知道比較實用strcmp函數進行比較,對沒有用過的函數沒有一點辦法。
3、實驗9.3.3
1、問題的簡單描述:編寫程序填寫表格。從鍵盤輸入學生和教師的信息,若是學生,則班級\職務欄填寫班級;若是教師,則班級\職務欄填寫職稱。
流程圖如圖所示:
2.實驗代碼:
#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);elseprintf("%d %s %c %s\n",person[i].number,person[i].name,person[i].job,person[i].category.position);}}3.運行結果
4.問題分析:這個實驗要把*name改成name【10】。
4、實驗9.3.4
1、問題的簡單描述:n個人圍成一個圈,從第s個人開始按順時鐘1,2,3,...,m的順序報數,數到m的人出圈,然后從出圈的下一個人開始重復此過程,輸出所有出圈人的順序,n,s,m從鍵盤輸入。
流程圖如圖所示:
2.實驗代碼:
#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;elselink[i].next=i+1;link[i].no=i;}count=0;if(s==1)h=n;else h=s-1;printf("出圈順序為:");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);}3.運行結果
沒有問題
實驗小結:這章節重在對各種數據類型的理解,熟悉運用,并且能夠掌握,如果不能理解,這就做不出題目。
轉載于:https://www.cnblogs.com/ouyangsijian/p/11111617.html
總結
以上是生活随笔為你收集整理的第九章 结构体与共用体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 03、MySQL—数据表操作
- 下一篇: Android进阶知识:ANR的定位与解