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