/* 名稱: school.c 作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/ 功能: 示範結構設計與欄位命名的原則, 僅供編譯參考, 不能執行 */ typedef struct { /* 日期型別 */ int year; /* 年 */ short month, day; /* 月, 日 */ /* 星期幾可以推算出來, 不需要記錄 */ } date; typedef enum { BT_O, BT_A, BT_B, BT_AB } blood_type; typedef struct { /* 個人基本資料型別 */ char name[20]; /* 姓名 */ char id[11]; /* 身份證字號 */ date birthday; /* 生肖、星座可以推算出來, 不必記錄 */ blood_type blood; } person; typedef struct { /* 學生型別 */ person demograph; /* 欄位名稱不必和欄位型別類似, 要能凸顯欄位在該記錄中的角色 */ char sid[10]; /* 學號 */ /* 假設沒有轉系情況, 則系別, 部別, 班級可以推算出來, 不要記錄 */ } student; typedef struct { /* 教師型別 */ person demograph; char fid[8]; /* 教員編號 */ date start; /* 到職日期 */ } faculty; #define MAX_CLASS_SIZE 60 typedef struct { /* 課程型別 */ char id[20]; /* 課程代號 */ faculty *instructor; /* 授課教師 */ /* 存放指標, 不存放真正的 faculty 記錄, 避免資料重複不一致等問題 */ int size; /* 修課人數 */ student *roster[MAX_CLASS_SIZE]; /* 修課同學 */ /* 存放指標, 不存放真正的 faculty 記錄, 避免資料重複不一致等問題 */ int grade[MAX_CLASS_SIZE]; /* 成績 */ } course; #define MAX_SPECIAL_TOPIC_SIZE 5 #define leader member[0] typedef struct { /* 專題組型別 */ char name[20]; /* 專題名稱 */ faculty *instructor; /* 指導老師 */ int size; /* 本組人數 */ student *member[MAX_SPECIAL_TOPIC_SIZE]; /* 組員 */ date next_meeting; /* 下次開會日期 */ } special_topic; typedef struct { /* 班級組織型別 */ faculty *advisor; /* 導師 */ student *rep, *vrep; /* 班代與副班代 */ /* 欄位名稱不必和欄位型別類似, 要能凸顯欄位在該記錄中的角色 */ } class_org; int zodiac(date birthday); /* 根據 birthday 計算星座 */ /* 副程式參數盡量用 struct, 而且向呼叫者要最少的資訊 */ int weekday(date day); /* 計算 day 這天是星期幾 */ int date_compare(date day1, date day2); /* day1 與 day2 孰前孰後? */ int match(int a, int b); /* a 與 b 兩個星座的人是否個性相和? */ void test(void) { int i=5, j=6; course cxx; special_topic ddb; class_org zz; strcpy(ddb.name, "分散式資料庫"); cxx.size = 51; strcpy(cxx.instructor->demograph.name, "洪朝貴"); cxx.roster[i]->demograph.birthday.year = 1980; if (0 == strcmp(ddb.member[i]->sid, cxx.roster[j]->sid)) cxx.grade[j] += 5; if (! match(zodiac(ddb.member[i]->demograph.birthday), zodiac(ddb.leader->demograph.birthday)) ) { } if (0 == weekday(ddb.next_meeting) || 0 == date_compare(ddb.next_meeting, ddb.instructor->demograph.birthday) ) { } if (zz.advisor == cxx.instructor) { } }