結構體變量的應用算法
結構體數組的應用數組
共用體的應用函數
結構體指針的應用學習
一、掌握結構體類型說明和結構體類型變量、數組、指針的定義方法及使用。
二、學會引用結構體中的成員。
三、掌握利用指向結構體的指針成員構成鏈表的基本算法。
四、瞭解聯合體類型和枚舉類型的說明、其變量的定義及賦初值的方法。
五、瞭解聯合類型變量中各成員的存儲結構,學會引用各成員中的數據。
六、學習正確引用枚舉類型常量,瞭解如何對枚舉類型變量進行操做。spa
一、簡單問題描述:試利用結構體類型描述年、月、日,輸入一個日期,統計該日期是本年度第多少天。程序流程圖以下:設計
二、實驗代碼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;
一、簡單問題描述:在選舉中進行投票,包含候選人姓名,得票數,假設有多位候選人,用結構體數組統計各候選人的得票數。程序流程圖以下所示:
二、實驗代碼
#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」。
一、簡單問題描述:若將教師和學生的數據放在統一表格中。教師的數據包括編號,姓名,職業和職務,學生的數據包括編號,姓名,職業和班級。試編寫程序填寫表格。程序流程圖以下所示:
二、實驗代碼
#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);由於我輸入的順序和字符類型不一樣。
一、簡單問題描述: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); } }
三、問題分析
按照流程圖和書上提示來,並無太大的問題。
收穫:
一、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爲輸出空格。