根據氣象劃分法:3-5 月春季,6-8 月夏季,9-11 月秋季,12-2 月冬季。輸入月份 (1-12),輸出對應季節。核心考點:switch-case 穿透特性、多標籤共用代碼塊、邊界輸入驗證。
#include <stdio.h>
void season(int m);
int main() {
int month;
printf("請輸入月份: ");
scanf("%d", &month);
season(month);
return 0;
}
void season(int m) {
switch (m) {
case 3: case 4: case 5:
printf("您輸入的月份 %d 在春季\n", m);
break;
case 6: case 7: case 8:
printf("您輸入的月份 %d 在夏季\n", m);
break;
case 9: case 10: case 11:
printf("您輸入的月份 %d 在秋季\n", m);
break;
case 12: case 1: case 2:
printf("您輸入的月份 %d 在冬季\n", m);
break;
default:
printf("您輸入的數字不在 1-12 月份內!\n");
}
}
// 無 break 的穿透行為(有時有用,多數是 Bug)
switch (m) {
case 1: printf("一月");
case 2: printf("二月"); // m=1 時也會執行!
case 3: printf("三月");
default: printf("其他");
}
// m=1 輸出: 一月二月三月其他
本題利用無 break 穿透實現「多月份共用一個輸出邏輯」,是 switch 的經典合法用法。
case 3:, case 'a':, case 1+2:case x: (變量), case 1.5: (浮點), case "str": (字符串)| 方案 | 代碼 | 優點 | 缺點 |
|---|---|---|---|
| switch (推薦) | 多 case 穿透 | 跳轉表 O(1)、語義清晰、易維護 | 僅支持整型常量 |
| if-else 鏈 | if(m>=3&&m<=5)... | 支持任意條件表達式 | O(n) 比較、代碼冗長 |
| 查表法 | char* s[]={"冬","春","春"...}; puts(s[m]); | 極簡、O(1)、數據驅動 | 需處理 m=0/>12 越界 |
| 數學公式 | (m%12+2)/3 映射 0-3 | 無分支、極快 | 可讀性差、邊界易錯 |
| 輸入 | 預期輸出 | 測試目的 |
|---|---|---|
| 3 | 春季 | 邊界起始 |
| 5 | 春季 | 邊界結束 |
| 12 | 冬季 | 跨年邊界 |
| 1 | 冬季 | 跨年邊界 |
| 0 | 錯誤 | 下界外 |
| 13 | 錯誤 | 上界外 |
| -5 | 錯誤 | 負數 |
switch-case 判斷季節是「多分支、整型常量、穿透特性」的教科書級案例。關鍵收穫:
case A: case B: case C: 穿透合並邏輯;default 情況,防禦性編程。