
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:
breakdùng để thoát khỏi switch sau khi thực thi xong một case. Nếu thiếubreak, 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-case và if-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;
}
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)
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;
}
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:
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:
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:
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:
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:
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:
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:
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:
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: