---
# System prepended metadata

title: 第九上課
tags: [C++講義]

---

# switch 

## 題目：

給定一個整數，輸入 1 表示「星期一」，2 表示「星期二」…… 7 表示「星期日」。請輸出對應的星期名稱。

```cpp
#include <iostream>
using namespace std;

int main() {
    int day;
    cin >> day;
    if (day == 1) cout << "星期一";
    else if (day == 2) cout << "星期二";
    else if (day == 3) cout << "星期三";
    else if (day == 4) cout << "星期四";
    else if (day == 5) cout << "星期五";
    else if (day == 6) cout << "星期六";
    else if (day == 7) cout << "星期日";
    else cout << "輸入錯誤";
    return 0;
}
```
### 不要這樣寫啦！很醜

用一堆 `if-else` 實在太麻煩了！這種情況下，`switch` 語句可以讓我們的程式碼更簡潔、更易讀。

---

## `switch` 語句的寫法

`switch` 語句根據變數的「值」，執行對應的程式碼，語法如下：

```cpp
switch (變數) {
    case 值1:
        // 當變數等於 值1 時執行的程式碼
        break;
    case 值2:
        // 當變數等於 值2 時執行的程式碼
        break;
    ...
    default:
        // 當變數不符合任何 case 時執行的程式碼
}
```

### 語法說明：
1. **`switch (變數)`**：檢查變數的值。
2. **`case 值:`**：當變數的值等於 `值` 時，執行該 `case` 下的程式碼。
3. **`break;`**：表示結束當前的 `case`，跳出 `switch` 語句。
4. **`default:`**：當所有 `case` 都不符合時，執行 `default` 中的程式碼（可選）。

---

## 舉例

### 使用 `switch` 輸出星期名稱

我們將剛剛的程式碼改寫成使用 `switch`：

```cpp
#include <iostream>
using namespace std;

int main() {
    int day;
    cin >> day;  // 輸入一個數字

    switch (day) {
        case 1:
            cout << "星期一";
            break;
        case 2:
            cout << "星期二";
            break;
        case 3:
            cout << "星期三";
            break;
        case 4:
            cout << "星期四";
            break;
        case 5:
            cout << "星期五";
            break;
        case 6:
            cout << "星期六";
            break;
        case 7:
            cout << "星期日";
            break;
        default:
            cout << "輸入錯誤";
            break;
    }

    return 0;
}
```

---

### 程式碼說明：

1. **`switch (day)`**：根據 `day` 的值選擇執行對應的 `case`。
2. **`case 1:` 到 `case 7:`**：輸出對應的星期名稱。
3. **`default:`**：當輸入不在 1 到 7 之間時，輸出「輸入錯誤」。
4. **`break;`**：防止程式繼續執行其他的 `case`，跳出 `switch` 結構。

---

## 注意事項

1. **`break` 的重要性**  
   如果沒有 `break`，程式會「穿透」到下一個 `case`，繼續執行下面的程式碼，直到遇到 `break` 或結束 `switch`。

   **示範：忘記加 `break` 的結果**
   ```cpp
   switch (2) {
       case 1: cout << "星期一";
       case 2: cout << "星期二";
       case 3: cout << "星期三";
       default: cout << "輸入錯誤";
   }
   ```
   **輸出結果：**  
   `星期二星期三輸入錯誤`  

   所以記得在每個 `case` 後加上 `break`！

2. **`default` 是選配的**  
   如果不需要處理例外情況，可以省略 `default`。

3. **`switch` 只支援整數、字元類型**  
   - `switch` 只能用整數或字元作為條件判斷，不能使用浮點數或字串。

---

## 小結

| 語法       | 適用情境             | 特點                                       |
|------------|----------------------|--------------------------------------------|
| `if-else`  | 判斷範圍或多個條件   | 彈性較高，但程式碼可能較冗長               |
| `switch`   | 判斷固定的數值       | 適合單一變數、固定值的情況，程式碼簡潔清晰 |

---

### 練習題

### [題目 1：四季有你真好](http://120.101.182.21/d/hd112/p/46) 
### [題目 3：座標移動](http://120.101.182.21/d/hd112/p/47)
   
### 額外練習題(不用switch)

### [題目 2：數字島](http://120.101.182.21/d/hd112/p/45)  
### [題目 4：考拉茲猜想—愛情歸宿](http://120.101.182.21/d/hd112/p/48)  