本文精選《C 語言程式設計教學》第九章 9 道經典例題,涵蓋結構體定義、巢狀結構、結構體陣列、共用體節省空間、列舉型別、typedef 簡化宣告、結構體指標傳參,每題附完整代碼與關鍵點解析。
知識點:結構體定義、巢狀結構 (struct date)、陣列成員、字串輸入、flushall() 清緩衝。
struct date { int year, month, day; };
struct student {
char num[9], name[21], sex;
int age;
struct date birthday;
int score[3];
float aver;
};
// 輸入 -> 計算平均 -> 格式化輸出
知識點:結構體陣列、strcmp 字串比較、選擇排序依票數降序、結構體整體交換。
struct person { char name[20]; int count; };
struct person leader[3] = {"fu",0,"lu",0,"shou",0};
// 統計 -> 排序 -> 輸出
知識點:結構體作函數參數/返回值、kbhit()/getch() 非阻塞鍵盤檢測、sleep() 延遲、\r 回行首覆寫顯示。
struct clock { int hours, minutes, seconds; };
struct clock update(struct clock t) { ... } // 值傳遞返回新狀態
void display(struct clock t) { printf("\r%02d:%02d:%02d", ...); }
知識點:模組化設計(輸入、平均、排序、輸出四函數)、結構體陣列排序、函數參數傳陣列指標。
void Input(struct student st[], int n);
void CalAver(struct student st[], int n);
void Sort(struct student st[], int n); // 依平均分升序
void Output(struct student st[], int n);
知識點:union 成員共用記憶體、int (2/4 位元組) 與 char[2] 重疊、十六進位與字元雙重解讀。
union int_char { char ch[2]; int i; };
// i = 19788 (0x4D54) → ch[0]='T'(0x54), ch[1]='M'(0x4D) (小端序)
知識點:結構體內嵌共用體、sex 判斷存取不同共用體成員、實現「同一欄位、不同結構」的多態效果。
struct boyscore { int minute, second; };
struct girlscore { char flexibility; int number; };
struct student {
char num[9], name[21], sex;
union { struct boyscore bs; struct girlscore gs; } score;
};
知識點:enum 定義離散常數、三層迴窮舉、switch 輸出中文、格式化列印每行 5 組。
enum color {red, yellow, white, blue, black};
for (b[0]=red; b[0]<=black; b[0]++)
for (b[1]=red; b[1]<=black; b[1]++)
for (b[2]=red; b[2]<=black; b[2]++)
if (三顏色各異) 輸出;
知識點:typedef 簡化宣告、陣列初始化列表、結構體指標 p->member 存取、指標算術遍歷。
typedef struct student { int id; char name[20]; int score; } STUDENT;
STUDENT st[3] = {{10101,"Li Lin",98}, {10102,"Zhang Fun",87}, {10103,"Wang Min",79}};
for (STUDENT *p = st; p < st+3; p++) printf(...);
知識點:typedef 別名、函數參數用結構體指標模擬引用傳遞、-> 運算子存取成員、平均值計算。
typedef struct person { int num; char name[21]; int s[3]; float aver; } PERSON;
void Input(PERSON *p) { scanf("%d%s%d%d%d", &p->num, p->name, &p->s[0], &p->s[1], &p->s[2]); ... }
int main() { PERSON st; Input(&st); ... }
| 概念 | 關鍵語法 | 典型應用 |
|---|---|---|
| 結構體 | struct Tag { members; }; | 異質資料聚合 |
| 巢狀結構 | struct A { struct B b; }; | 複雜實體建模 |
| 結構體陣列 | struct A arr[N]; | 同類實體集合 |
| 共用體 | union Tag { members; }; | 省記憶體、型別雙重解讀 |
| 結構體嵌共用體 | struct { union {A a; B b;} u; } | 變體記錄 |
| 枚舉 | enum Tag {V1, V2}; | 離散狀態語意化 |
| typedef | typedef struct A A; | 簡化宣告、資訊隱藏 |
| 結構體指標 | struct A *p; p->mem | 函數修改實參、動態配置 |
scanf("%s", &st.name) → 錯誤!陣列名已是位址,正確 scanf("%s", st.name)flushall() 非標準,建議用 while(getchar()!='\n'); 清緩衝int,可直接參與運算掌握此 9 例,即能靈活運用結構體、共用體、枚舉解決實務中「異質資料聚合、記憶體優化、狀態機建模」等問題。