S SmartDocs
Serie: C++ cpp 263 righe · Aggiornato 2026-04-03

switch_case.cpp

C++/Part1_基礎入門/Ch03_控制流程/switch_case.cpp

// ============================================================
// Ch03 - switch / case 示範
// 編譯:g++ -std=c++17 -Wall -o switch_case switch_case.cpp
// 執行:./switch_case
// ============================================================

#include <iostream>
#include <string>

int main() {
    // ══════════════════════════════════════════
    // 1. 基本 switch(整數)
    // ══════════════════════════════════════════
    std::cout << "=== 基本 switch(星期判斷)===" << std::endl;

    int day = 3;
    std::cout << "day = " << day << " → ";

    switch (day) {
        case 1:
            std::cout << "星期一" << std::endl;
            break;
        case 2:
            std::cout << "星期二" << std::endl;
            break;
        case 3:
            std::cout << "星期三" << std::endl;
            break;
        case 4:
            std::cout << "星期四" << std::endl;
            break;
        case 5:
            std::cout << "星期五" << std::endl;
            break;
        case 6:
            std::cout << "星期六" << std::endl;
            break;
        case 7:
            std::cout << "星期日" << std::endl;
            break;
        default:
            std::cout << "無效的日期!(請輸入 1-7)" << std::endl;
            break;
    }

    // ══════════════════════════════════════════
    // 2. switch 搭配 char
    // ══════════════════════════════════════════
    std::cout << "\n=== switch 搭配 char ===" << std::endl;

    char grade = 'B';
    std::cout << "等第 '" << grade << "' → ";

    switch (grade) {
        case 'A':
            std::cout << "90-100 分,優秀!" << std::endl;
            break;
        case 'B':
            std::cout << "80-89 分,良好" << std::endl;
            break;
        case 'C':
            std::cout << "70-79 分,普通" << std::endl;
            break;
        case 'D':
            std::cout << "60-69 分,及格" << std::endl;
            break;
        case 'F':
            std::cout << "60 分以下,不及格" << std::endl;
            break;
        default:
            std::cout << "無效的等第" << std::endl;
            break;
    }

    // ══════════════════════════════════════════
    // 3. break 的重要性 — 穿透(Fall-through)
    // ══════════════════════════════════════════
    std::cout << "\n=== 穿透效果(忘記 break)===" << std::endl;

    int num = 2;
    std::cout << "num = " << num << ",不加 break 的結果:" << std::endl;

    switch (num) {
        case 1:
            std::cout << "  case 1" << std::endl;
            // 沒有 break,會繼續執行下一個 case
        case 2:
            std::cout << "  case 2" << std::endl;
            // 沒有 break,繼續穿透
        case 3:
            std::cout << "  case 3" << std::endl;
            // 沒有 break,繼續穿透
        case 4:
            std::cout << "  case 4" << std::endl;
            break;  // 在這裡才停止
        case 5:
            std::cout << "  case 5(不會執行到這裡)" << std::endl;
            break;
    }

    // ══════════════════════════════════════════
    // 4. 故意穿透 — 多個 case 共用程式碼
    // ══════════════════════════════════════════
    std::cout << "\n=== 故意穿透(平日/假日判斷)===" << std::endl;

    for (int d = 1; d <= 7; d++) {
        std::cout << "day " << d << ":";
        switch (d) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                std::cout << "平日(上班/上課)" << std::endl;
                break;
            case 6:
            case 7:
                std::cout << "假日(休息)" << std::endl;
                break;
        }
    }

    // ══════════════════════════════════════════
    // 5. 每月天數判斷(穿透應用)
    // ══════════════════════════════════════════
    std::cout << "\n=== 每月天數 ===" << std::endl;

    int month = 2;
    int year = 2024;
    int days;

    switch (month) {
        case 1: case 3: case 5: case 7:
        case 8: case 10: case 12:
            days = 31;
            break;
        case 4: case 6: case 9: case 11:
            days = 30;
            break;
        case 2:
            // 閏年判斷:能被 4 整除且不被 100 整除,或能被 400 整除
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                days = 29;
            } else {
                days = 28;
            }
            break;
        default:
            days = -1;  // 無效月份
            break;
    }

    if (days > 0) {
        std::cout << year << " 年 " << month << " 月有 " << days << " 天" << std::endl;
    } else {
        std::cout << "無效的月份:" << month << std::endl;
    }

    // ══════════════════════════════════════════
    // 6. 簡易計算機
    // ══════════════════════════════════════════
    std::cout << "\n=== 簡易計算機 ===" << std::endl;

    double num1 = 15.0, num2 = 4.0;
    char op = '/';

    std::cout << num1 << " " << op << " " << num2 << " = ";

    switch (op) {
        case '+':
            std::cout << (num1 + num2) << std::endl;
            break;
        case '-':
            std::cout << (num1 - num2) << std::endl;
            break;
        case '*':
            std::cout << (num1 * num2) << std::endl;
            break;
        case '/':
            if (num2 != 0) {
                std::cout << (num1 / num2) << std::endl;
            } else {
                std::cout << "錯誤:除數不能為零!" << std::endl;
            }
            break;
        case '%':
            std::cout << static_cast<int>(num1) % static_cast<int>(num2) << std::endl;
            break;
        default:
            std::cout << "不支援的運算子:'" << op << "'" << std::endl;
            break;
    }

    // ══════════════════════════════════════════
    // 7. 選單系統示範
    // ══════════════════════════════════════════
    std::cout << "\n=== 選單系統 ===" << std::endl;

    std::cout << "┌────────────────────┐" << std::endl;
    std::cout << "│   餐廳點餐系統     │" << std::endl;
    std::cout << "├────────────────────┤" << std::endl;
    std::cout << "│ 1. 牛肉麵    $150  │" << std::endl;
    std::cout << "│ 2. 雞排飯    $100  │" << std::endl;
    std::cout << "│ 3. 炒飯      $80   │" << std::endl;
    std::cout << "│ 4. 滷肉飯    $50   │" << std::endl;
    std::cout << "│ 0. 離開            │" << std::endl;
    std::cout << "└────────────────────┘" << std::endl;

    int choice = 2;  // 模擬使用者選擇
    std::cout << "選擇:" << choice << std::endl;

    std::string item;
    int price = 0;

    switch (choice) {
        case 1:
            item = "牛肉麵";
            price = 150;
            break;
        case 2:
            item = "雞排飯";
            price = 100;
            break;
        case 3:
            item = "炒飯";
            price = 80;
            break;
        case 4:
            item = "滷肉飯";
            price = 50;
            break;
        case 0:
            std::cout << "謝謝光臨,再見!" << std::endl;
            return 0;
        default:
            std::cout << "無效的選項!" << std::endl;
            return 1;
    }

    std::cout << "您點了:" << item << ",價格:$" << price << std::endl;

    // ══════════════════════════════════════════
    // 8. switch 的限制說明
    // ══════════════════════════════════════════
    std::cout << "\n=== switch 的限制 ===" << std::endl;
    std::cout << "1. case 值必須是整數常數(int, char, enum)" << std::endl;
    std::cout << "2. 不能使用 string、float、double 作為 case 值" << std::endl;
    std::cout << "3. 不能使用變數作為 case 值(必須是編譯期常數)" << std::endl;
    std::cout << "4. 每個 case 後面記得加 break(除非故意穿透)" << std::endl;
    std::cout << "5. 建議加上 default 處理未預期的值" << std::endl;

    // 如果需要比較 string,使用 if/else if 代替:
    std::string color = "紅色";
    if (color == "紅色") {
        std::cout << "\nRed!" << std::endl;
    } else if (color == "藍色") {
        std::cout << "\nBlue!" << std::endl;
    } else {
        std::cout << "\n其他顏色" << std::endl;
    }

    return 0;
}

Articoli correlati