Bỏ qua

Banner switch-case C++

Buổi 10: Cấu Trúc Đa Nhánh switch-case

I. Lý Thuyết

1. Tại Sao Cần switch-case?

Khi cần so sánh một biến với nhiều giá trị cụ thể, dùng if-else if sẽ dài dòng:

// Cách cũ — dài dòng
if (chon == 1) { ... }
else if (chon == 2) { ... }
else if (chon == 3) { ... }

switch-case giúp code ngắn gọn, rõ ràng và dễ đọc hơn cho trường hợp này.


2. Cú Pháp switch-case

switch (bieu_thuc) {
    case gia_tri_1:
        // Lệnh thực thi khi bieu_thuc == gia_tri_1
        break;
    case gia_tri_2:
        // Lệnh thực thi khi bieu_thuc == gia_tri_2
        break;
    case gia_tri_3:
        // Lệnh thực thi khi bieu_thuc == gia_tri_3
        break;
    default:
        // Thực thi khi không khớp case nào
        break;
}

Quan trọng: break dùng để thoát khỏi switch sau khi thực thi xong một case. Nếu thiếu break, chương trình sẽ "rơi xuống" (fall-through) sang case tiếp theo!


3. Quy Tắc Của switch-case

Quy tắc Giải thích
bieu_thuc phải là kiểu nguyên int, char, long — KHÔNG dùng float, double, string
Giá trị trong case phải là hằng số case 1:, case 'A': — KHÔNG phải case x:
break sau mỗi case Tránh fall-through không mong muốn
default nên có Xử lý trường hợp không khớp case nào

4. Fall-Through — Tính Năng Đặc Biệt

Khi cố tình bỏ break, nhiều case có thể dùng chung một đoạn code:

int thang = 4;
switch (thang) {
    case 4:
    case 6:
    case 9:
    case 11:
        cout << "Thang co 30 ngay" << endl;
        break;
    case 2:
        cout << "Thang 2 co 28 hoac 29 ngay" << endl;
        break;
    default:
        cout << "Thang co 31 ngay" << endl;
}

5. So Sánh switch-caseif-else if

Tiêu chí switch-case if-else if
Dùng với Giá trị rời rạc, cụ thể (1, 2, 'A') Mọi điều kiện (khoảng giá trị, phức hợp)
Kiểu dữ liệu int, char Mọi kiểu
Dễ đọc ✅ Khi nhiều giá trị cụ thể ✅ Khi điều kiện phức tạp

II. Ví Dụ Minh Họa

Ví dụ 1: Hiển thị tên ngày trong tuần

#include <iostream>
using namespace std;

int main() {
    int thu;
    cout << "Nhap thu (2-8): ";
    cin >> thu;

    switch (thu) {
        case 2: cout << "Thu Hai"   << endl; break;
        case 3: cout << "Thu Ba"    << endl; break;
        case 4: cout << "Thu Tu"    << endl; break;
        case 5: cout << "Thu Nam"   << endl; break;
        case 6: cout << "Thu Sau"   << endl; break;
        case 7: cout << "Thu Bay"   << endl; break;
        case 8: cout << "Chu Nhat"  << endl; break;
        default: cout << "Thu khong hop le!" << endl; break;
    }

    return 0;
}
✅ Kết quả (nhập: 4)
Nhap thu (2-8): 4
Thu Tu

Ví dụ 2: Menu lựa chọn môn học

#include <iostream>
using namespace std;

int main() {
    int chon;
    cout << "=== CHON MON HOC ===" << endl;
    cout << "1. Toan  2. Van  3. Anh  4. Ly" << endl;
    cout << "Nhap lua chon: ";
    cin >> chon;

    switch (chon) {
        case 1:
            cout << "Ban chon: Toan" << endl;
            cout << "Giao vien: Thay Minh" << endl;
            break;
        case 2:
            cout << "Ban chon: Van" << endl;
            cout << "Giao vien: Co Lan" << endl;
            break;
        case 3:
            cout << "Ban chon: Anh" << endl;
            cout << "Giao vien: Co Hoa" << endl;
            break;
        case 4:
            cout << "Ban chon: Ly" << endl;
            cout << "Giao vien: Thay Duc" << endl;
            break;
        default:
            cout << "Lua chon khong hop le!" << endl;
            break;
    }

    return 0;
}
✅ Kết quả (nhập: 2)
=== CHON MON HOC ===
1. Toan  2. Van  3. Anh  4. Ly
Nhap lua chon: 2
Ban chon: Van
Giao vien: Co Lan

Ví dụ 3: Phân loại mùa trong năm (fall-through)

#include <iostream>
using namespace std;

int main() {
    int thang;
    cout << "Nhap thang (1-12): ";
    cin >> thang;

    switch (thang) {
        case 12:
        case 1:
        case 2:
            cout << "Mua Dong" << endl;
            break;
        case 3:
        case 4:
        case 5:
            cout << "Mua Xuan" << endl;
            break;
        case 6:
        case 7:
        case 8:
            cout << "Mua He" << endl;
            break;
        case 9:
        case 10:
        case 11:
            cout << "Mua Thu" << endl;
            break;
        default:
            cout << "Thang khong hop le!" << endl;
            break;
    }

    return 0;
}
✅ Kết quả (nhập: 7)
Nhap thang (1-12): 7
Mua He

III. Bài Tập Thực Hành Tại Lớp

Bài 1: Hiển thị tên tháng

Đề bài: Nhập số tháng (1–12), in ra tên tháng bằng tiếng Việt.

Phân tích đề

Dùng switch với 12 case. Thêm default để xử lý tháng không hợp lệ.

Output mẫu:

Nhap thang (1-12): 9
Thang Chin

Gợi ý code
#include <iostream>
using namespace std;

int main() {
    int thang;
    cout << "Nhap thang (1-12): ";
    cin >> thang;

    switch (thang) {
        case 1:  cout << "Thang Mot"   << endl; break;
        case 2:  cout << "Thang Hai"   << endl; break;
        case 3:  cout << "Thang Ba"    << endl; break;
        case 4:  cout << "Thang Tu"    << endl; break;
        case 5:  cout << "Thang Nam"   << endl; break;
        case 6:  cout << "Thang Sau"   << endl; break;
        case 7:  cout << "Thang Bay"   << endl; break;
        case 8:  cout << "Thang Tam"   << endl; break;
        case 9:  cout << "Thang Chin"  << endl; break;
        case 10: cout << "Thang Muoi"  << endl; break;
        case 11: cout << "Thang Muoi Mot" << endl; break;
        case 12: cout << "Thang Muoi Hai" << endl; break;
        default: cout << "Thang khong hop le!" << endl; break;
    }
    return 0;
}

Bài 2: Xếp loại theo ký tự

Đề bài: Nhập ký tự xếp loại ('A', 'B', 'C', 'D', 'F'). In ra mô tả tương ứng.

Phân tích đề

Dùng switch với kiểu char. Chú ý chữ hoa/thường: 'A''a'.

Output mẫu:

Nhap xep loai (A/B/C/D/F): B
Kha - Diem tu 7.0 den duoi 8.0

Gợi ý code
#include <iostream>
using namespace std;

int main() {
    char xepLoai;
    cout << "Nhap xep loai (A/B/C/D/F): ";
    cin >> xepLoai;

    switch (xepLoai) {
        case 'A':
            cout << "Xuat sac - Diem tu 9.0 tro len" << endl; break;
        case 'B':
            cout << "Kha - Diem tu 7.0 den duoi 9.0" << endl; break;
        case 'C':
            cout << "Trung binh - Diem tu 5.0 den duoi 7.0" << endl; break;
        case 'D':
            cout << "Yeu - Diem tu 3.5 den duoi 5.0" << endl; break;
        case 'F':
            cout << "Kem - Diem duoi 3.5" << endl; break;
        default:
            cout << "Xep loai khong hop le!" << endl; break;
    }
    return 0;
}

Bài 3: Tính tiền vé xem phim

Đề bài: Nhập loại ghế (1=Thường, 2=VIP, 3=VVIP). In ra giá vé. Ghế thường: 80.000đ; VIP: 120.000đ; VVIP: 200.000đ.

Phân tích đề

Output mẫu:

Chon loai ghe (1=Thuong, 2=VIP, 3=VVIP): 2
Loai ghe: VIP
Gia ve  : 120000 dong

Gợi ý code
#include <iostream>
#include <string>
using namespace std;

int main() {
    int loaiGhe;
    cout << "Chon loai ghe (1=Thuong, 2=VIP, 3=VVIP): ";
    cin >> loaiGhe;

    int giaVe;
    string tenLoai;

    switch (loaiGhe) {
        case 1: tenLoai = "Thuong"; giaVe = 80000;  break;
        case 2: tenLoai = "VIP";    giaVe = 120000; break;
        case 3: tenLoai = "VVIP";   giaVe = 200000; break;
        default:
            cout << "Lua chon khong hop le!" << endl;
            return 0;
    }

    cout << "Loai ghe: " << tenLoai << endl;
    cout << "Gia ve  : " << giaVe << " dong" << endl;
    return 0;
}

Bài 4: Máy tính 4 phép tính

Đề bài: Nhập hai số thực a, b và ký tự toán tử (+, -, *, /). Tính và in kết quả.

Phân tích đề

Dùng switch với char cho toán tử. Chú ý trường hợp chia cho 0.

Output mẫu:

Nhap phep tinh (vd: 10 + 5): 10 / 4
10 / 4 = 2.5

Gợi ý code
#include <iostream>
using namespace std;

int main() {
    float a, b;
    char op;
    cout << "Nhap phep tinh (vd: 10 + 5): ";
    cin >> a >> op >> b;

    switch (op) {
        case '+': cout << a << " + " << b << " = " << a + b << endl; break;
        case '-': cout << a << " - " << b << " = " << a - b << endl; break;
        case '*': cout << a << " * " << b << " = " << a * b << endl; break;
        case '/':
            if (b != 0)
                cout << a << " / " << b << " = " << a / b << endl;
            else
                cout << "Loi: Khong the chia cho 0!" << endl;
            break;
        default:
            cout << "Toan tu khong hop le!" << endl; break;
    }
    return 0;
}

IV. Bài Tập Về Nhà

Bài 1: Số ngày trong tháng

Đề bài: Nhập số tháng (1–12). In ra số ngày của tháng đó (không xét năm nhuận, tháng 2 có 28 ngày).

Phân tích đề

Dùng fall-through cho các tháng có cùng số ngày: tháng 30 ngày (4, 6, 9, 11), tháng 31 ngày (còn lại), tháng 2 là 28.

Output mẫu:

Nhap thang: 6
Thang 6 co 30 ngay.


Bài 2: Chuyển đổi điểm số sang xếp loại

Đề bài: Nhập điểm nguyên (0–10). Chuyển sang xếp loại: 9–10 → A, 7–8 → B, 5–6 → C, 3–4 → D, 0–2 → F. (Gợi ý: dùng switch (diem / 2) hoặc switch với nhiều case ghép).

Phân tích đề

Mẹo: Dùng switch(diem) với case ghép: case 9: case 10: → A.

Output mẫu:

Nhap diem (0-10): 8
Xep loai: B


Bài 3: Thực đơn nhà hàng

Đề bài: Hiển thị menu 5 món ăn với giá. Khách nhập số thứ tự và số lượng. Tính và in tổng tiền.

Phân tích đề

Menu: 1.Pho(45k) 2.Com(35k) 3.Bun(40k) 4.Banh mi(20k) 5.Cafe(25k)

Output mẫu:

=== THUC DON ===
1. Pho bo    : 45000d
2. Com suon  : 35000d
3. Bun bo    : 40000d
4. Banh mi   : 20000d
5. Cafe sua  : 25000d
Chon mon: 1
So luong: 2
Tong tien: 90000 dong


Bài 4: Tính cước taxi

Đề bài: Nhập loại xe (1=4 chỗ, 2=7 chỗ) và số km. Giá: 4 chỗ 12.000đ/km, 7 chỗ 15.000đ/km. Cả hai loại: 2km đầu tính 15.000đ cố định.

Phân tích đề

Công thức: Tiền = 15.000 + (km - 2) × giáKm (nếu km > 2) Kiểm tra đầu vào: Nếu km < 0 thì báo lỗi So km khong hop le!.

Output mẫu:

Loai xe (1=4 cho, 2=7 cho): 1
So km: 5
Cuoc phi: 51000 dong


V. Ghi Chú Quan Trọng

Lỗi Hay Gặp

Lỗi Nguyên nhân Cách sửa
Fall-through không mong muốn Quên break Luôn thêm break cuối mỗi case
Dùng float trong switch switch không hỗ trợ số thực Dùng if-else if với số thực
So sánh chuỗi trong switch switch không hỗ trợ string Dùng if-else if hoặc ký tự char
Quên default Không xử lý giá trị ngoài các case Luôn có default để bắt lỗi

Tóm Tắt Cú Pháp

switch (bieu_thuc_nguyen) {  // int, char, long...
    case gia_tri_1:
        // lệnh
        break;
    case gia_tri_2:
    case gia_tri_3:  // Fall-through: 2 và 3 dùng chung
        // lệnh
        break;
    default:
        // lệnh khi không khớp
        break;
}

VI. Ôn Tập Trắc Nghiệm

Kiểm tra kiến thức buổi học qua 16 câu trắc nghiệm:

Làm bài trắc nghiệm Buổi 10