輸入 1~7 對應周一至周日,輸出當天食譜;輸入其他數字提示錯誤。
#include
int main(void) {
int day;
printf("請輸入星期 (1-7):");
if (scanf("%d", &day) != 1) {
printf("輸入格式錯誤\n");
return 1;
}
switch (day) {
case 1: printf("周一:紅燒肉、青菜湯、米飯\n"); break;
case 2: printf("周二:蒸魚、炒時蔬、米飯\n"); break;
case 3: printf("周三:雞腿排、馬鈴薯泥、沙拉\n"); break;
case 4: printf("周四:義大利麵、蒜麵包、湯\n"); break;
case 5: printf("周五:漢堡、薯條、可樂\n"); break;
case 6: printf("周六:火鍋、飲料、冰淇淋\n"); break;
case 7: printf("周日:便當、水果、優格\n"); break;
default: printf("錯誤:請輸入 1 到 7 之間的整數\n"); break;
}
return 0;
}
| 元素 | 說明 | 注意事項 |
|---|---|---|
switch (expr) | 判斷式必須為**整數型別** (int, char, enum) | 不可用 float/double/字串 |
case 常數: | 標籤必須為**編譯期常數** | 不可用變數或範圍 |
break; | 跳出 switch,**必須加**否則貫穿 | 刻意貫穿需註解 /* fallthrough */ |
default: | 無匹配時執行,**建議永遠加上** | 位置可放任意處,慣例放最後 |
switch (day) {
case 1: case 2: case 3: case 4: case 5:
printf("平日食譜\n");
break;
case 6: case 7:
printf("假日食譜\n");
break;
default:
printf("錯誤輸入\n");
}
char grade;
scanf(" %c", &grade); // 空白吃掉換行
switch (grade) {
case 'A': case 'a': printf("優等\n"); break;
case 'B': case 'b': printf("甲等\n"); break;
// ...
}
typedef enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } Weekday;
Weekday day = WED;
switch (day) {
case MON: ... break;
case TUE: ... break;
// 若漏寫 case,GCC/Clang -Wswitch-enum 會警告
}
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
漏寫 break | 非預期貫穿,邏輯錯誤 | 加上 break 或標註 /* fallthrough */ |
case 1.5: | 浮點數非法 | 改用整數或字元 |
case n: (n 為變數) | 非常數標籤 | 改用 if-else 鏈 |
switch (str) | 字串非法 | 用 strcmp + if-else 或雜湊表 |
case 較少 (≤5) 時,編譯器常生成 **if-else 鏈**。case 較多且數值連續時,生成 **跳轉表**,O(1) 分派,極快。case 數值稀疏時,生成 **二分搜尋決策樹**,O(log n)。switch 是處理**離散整數值分派**的最佳工具。善用 break、default、多標籤貫穿、列舉配合,能寫出清晰、高效、易維護的分支邏輯。