Skip to content

🔀 Cấu trúc điều khiển trong C++

📖 Giới thiệu

Cấu trúc điều khiển (control structures) cho phép chương trình ra quyết định và thực hiện các hành động khác nhau dựa trên điều kiện. Đây là những "ngã rẽ" trong luồng thực thi chương trình, giúp code có thể xử lý các tình huống khác nhau một cách thông minh.

Trong thế giới thực, chúng ta luôn phải đưa ra quyết định: "Nếu trời mưa thì mang ô", "Nếu điểm >= 5 thì đậu, ngược lại thì trượt". Lập trình cũng vậy - chúng ta cần các cấu trúc để biểu diễn logic quyết định này.

C++ cung cấp các cấu trúc điều khiển chính: if-else để kiểm tra điều kiện, và switch-case để xử lý nhiều lựa chọn rời rạc.

🔧 Cú pháp

Cấu trúc if cơ bản

cpp
// If đơn giản
if (điều_kiện) {
    // Code thực thi khi điều kiện đúng
}

// If-else
if (điều_kiện) {
    // Code khi điều kiện đúng
} else {
    // Code khi điều kiện sai
}

// If-else if-else (nhiều điều kiện)
if (điều_kiện_1) {
    // Code cho điều kiện 1
} else if (điều_kiện_2) {
    // Code cho điều kiện 2
} else if (điều_kiện_3) {
    // Code cho điều kiện 3
} else {
    // Code mặc định (không điều kiện nào đúng)
}

Cấu trúc switch-case

cpp
switch (biến_hoặc_biểu_thức) {
    case giá_trị_1:
        // Code cho trường hợp 1
        break;
    case giá_trị_2:
        // Code cho trường hợp 2
        break;
    case giá_trị_3:
    case giá_trị_4:
        // Code cho cả trường hợp 3 và 4
        break;
    default:
        // Code mặc định
        break;
}

Toán tử điều kiện (Ternary Operator)

cpp
// Cú pháp: điều_kiện ? giá_trị_nếu_đúng : giá_trị_nếu_sai
int max = (a > b) ? a : b;
string result = (score >= 5) ? "Đậu" : "Trượt";

Điều kiện phức hợp

cpp
// Sử dụng toán tử logic
if (age >= 18 && hasLicense) {
    cout << "Được phép lái xe" << endl;
}

if (day == "Saturday" || day == "Sunday") {
    cout << "Cuối tuần" << endl;
}

if (!(temperature < 0)) {
    cout << "Nhiệt độ không âm" << endl;
}

🔬 Phân tích & Giải thích chi tiết

Khi nào dùng if vs switch?

Sử dụng if khi:

  • Điều kiện phức tạp (>, <, >=, <=)
  • So sánh với nhiều biến
  • Điều kiện liên tục (ranges)
  • Logic phức hợp với &&, ||

Sử dụng switch khi:

  • So sánh với giá trị cụ thể (discrete values)
  • Nhiều lựa chọn rời rạc
  • Kiểm tra giá trị enum, char, int
  • Code rõ ràng và dễ đọc hơn

Tầm quan trọng của break trong switch

cpp
// Không có break - "fall through"
switch (grade) {
    case 'A':
        cout << "Xuất sắc" << endl;
    case 'B':
        cout << "Giỏi" << endl;        // Sẽ in cả này nếu grade = 'A'
    case 'C':
        cout << "Khá" << endl;         // Và cả này
        break;
}

// Có break - đúng cách
switch (grade) {
    case 'A':
        cout << "Xuất sắc" << endl;
        break;                         // Thoát switch
    case 'B':
        cout << "Giỏi" << endl;
        break;
    case 'C':
        cout << "Khá" << endl;
        break;
}

Nested if (if lồng nhau)

cpp
if (weather == "sunny") {
    if (temperature > 25) {
        if (hasTime) {
            cout << "Đi biển!" << endl;
        } else {
            cout << "Làm việc trong nhà" << endl;
        }
    } else {
        cout << "Thời tiết mát, đi dạo công viên" << endl;
    }
} else {
    cout << "Ở nhà xem phim" << endl;
}

Short-circuit evaluation

cpp
// Với &&: nếu điều kiện đầu false, không kiểm tra điều kiện sau
if (ptr != nullptr && ptr->value > 10) {
    // An toàn: chỉ truy cập ptr->value khi ptr khác nullptr
}

// Với ||: nếu điều kiện đầu true, không kiểm tra điều kiện sau
if (isAdmin || (user.level >= 5 && user.hasPermission)) {
    // Nếu isAdmin = true, không cần kiểm tra các điều kiện phức tạp
}

Dangling else problem

cpp
// Có thể gây nhầm lẫn
if (condition1)
    if (condition2)
        statement1;
else                        // else này thuộc về if nào?
    statement2;

// Nên viết rõ ràng với {}
if (condition1) {
    if (condition2) {
        statement1;
    }
} else {
    statement2;
}

💻 Ví dụ minh họa

Chương trình phân loại điểm số

cpp
#include <iostream>
using namespace std;

int main() {
    double score;
    char grade;
    
    cout << "=== HỆ THỐNG PHÂN LOẠI ĐIỂM ===" << endl;
    cout << "Nhập điểm số (0-10): ";
    cin >> score;
    
    // Kiểm tra điểm hợp lệ
    if (score < 0 || score > 10) {
        cout << "Lỗi: Điểm phải từ 0 đến 10!" << endl;
        return 1;
    }
    
    // Phân loại điểm bằng if-else if
    if (score >= 9.0) {
        grade = 'A';
        cout << "Xếp loại: A (Xuất sắc)" << endl;
    } else if (score >= 8.0) {
        grade = 'B';
        cout << "Xếp loại: B (Giỏi)" << endl;
    } else if (score >= 6.5) {
        grade = 'C';
        cout << "Xếp loại: C (Khá)" << endl;
    } else if (score >= 5.0) {
        grade = 'D';
        cout << "Xếp loại: D (Trung bình)" << endl;
    } else {
        grade = 'F';
        cout << "Xếp loại: F (Yếu)" << endl;
    }
    
    // Xử lý thêm dựa trên grade bằng switch
    cout << "\nLời nhận xét: ";
    switch (grade) {
        case 'A':
            cout << "Tuyệt vời! Hãy tiếp tục phát huy!" << endl;
            break;
        case 'B':
            cout << "Rất tốt! Cố gắng thêm một chút nữa!" << endl;
            break;
        case 'C':
            cout << "Khá ổn! Hãy cải thiện thêm!" << endl;
            break;
        case 'D':
            cout << "Cần cố gắng hơn nữa!" << endl;
            break;
        case 'F':
            cout << "Cần ôn tập và học lại!" << endl;
            break;
        default:
            cout << "Lỗi hệ thống!" << endl;
    }
    
    // Kiểm tra đậu/rớt
    string result = (score >= 5.0) ? "ĐẬU" : "TRƯỢT";
    cout << "Kết quả cuối cùng: " << result << endl;
    
    return 0;
}
cpp
#include <iostream>
using namespace std;

int main() {
    double num1, num2, result;
    char operation;
    bool validOperation = true;
    
    cout << "=== MÁY TÍNH ĐƠN GIẢN ===" << endl;
    cout << "Nhập số thứ nhất: ";
    cin >> num1;
    
    cout << "Nhập phép toán (+, -, *, /, %): ";
    cin >> operation;
    
    cout << "Nhập số thứ hai: ";
    cin >> num2;
    
    // Sử dụng switch để xử lý các phép toán
    switch (operation) {
        case '+':
            result = num1 + num2;
            cout << num1 << " + " << num2 << " = " << result << endl;
            break;
            
        case '-':
            result = num1 - num2;
            cout << num1 << " - " << num2 << " = " << result << endl;
            break;
            
        case '*':
            result = num1 * num2;
            cout << num1 << " * " << num2 << " = " << result << endl;
            break;
            
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
                cout << num1 << " / " << num2 << " = " << result << endl;
            } else {
                cout << "Lỗi: Không thể chia cho 0!" << endl;
                validOperation = false;
            }
            break;
            
        case '%':
            if (num2 != 0) {
                // Ép kiểu về int cho phép chia dư
                int intResult = (int)num1 % (int)num2;
                cout << (int)num1 << " % " << (int)num2 << " = " << intResult << endl;
            } else {
                cout << "Lỗi: Không thể chia cho 0!" << endl;
                validOperation = false;
            }
            break;
            
        default:
            cout << "Lỗi: Phép toán '" << operation << "' không hợp lệ!" << endl;
            cout << "Chỉ hỗ trợ: +, -, *, /, %" << endl;
            validOperation = false;
    }
    
    if (validOperation) {
        cout << "Tính toán hoàn tất!" << endl;
    } else {
        cout << "Vui lòng thử lại với dữ liệu hợp lệ!" << endl;
    }
    
    return 0;
}

Chương trình kiểm tra tam giác

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

int main() {
    double a, b, c;
    
    cout << "=== KIỂM TRA TAM GIÁC ===" << endl;
    cout << "Nhập 3 cạnh của tam giác:" << endl;
    cout << "Cạnh a: ";
    cin >> a;
    cout << "Cạnh b: ";
    cin >> b;
    cout << "Cạnh c: ";
    cin >> c;
    
    // Kiểm tra tính hợp lệ
    if (a <= 0 || b <= 0 || c <= 0) {
        cout << "Lỗi: Độ dài cạnh phải lớn hơn 0!" << endl;
        return 1;
    }
    
    // Kiểm tra bất đẳng thức tam giác
    if (a + b > c && a + c > b && b + c > a) {
        cout << "Đây là một tam giác hợp lệ!" << endl;
        
        // Phân loại tam giác
        if (a == b && b == c) {
            cout << "Loại: Tam giác đều" << endl;
        } else if (a == b || b == c || a == c) {
            cout << "Loại: Tam giác cân" << endl;
        } else {
            cout << "Loại: Tam giác thường" << endl;
        }
        
        // Kiểm tra tam giác vuông (định lý Pythagoras)
        double maxSide = max({a, b, c});
        double side1, side2;
        
        if (maxSide == a) {
            side1 = b; side2 = c;
        } else if (maxSide == b) {
            side1 = a; side2 = c;
        } else {
            side1 = a; side2 = b;
        }
        
        // Kiểm tra với sai số nhỏ do floating point
        if (abs(maxSide * maxSide - (side1 * side1 + side2 * side2)) < 0.0001) {
            cout << "Đặc biệt: Đây cũng là tam giác vuông!" << endl;
        }
        
        // Tính diện tích bằng công thức Heron
        double s = (a + b + c) / 2;  // Nửa chu vi
        double area = sqrt(s * (s - a) * (s - b) * (s - c));
        cout << "Diện tích: " << area << endl;
        
    } else {
        cout << "Đây KHÔNG phải là tam giác!" << endl;
        cout << "Không thỏa mãn bất đẳng thức tam giác." << endl;
    }
    
    return 0;
}

🏋️ Thực hành

Bài tập 1: Phân loại tuổi

Viết chương trình phân loại độ tuổi:

  • 0-2: Em bé
  • 3-5: Mầm non
  • 6-10: Tiểu học
  • 11-14: THCS
  • 15-17: THPT
  • 18-22: Đại học
  • 23-59: Người lớn
  • 60+: Người cao tuổi

Bài tập 2: Menu đồ uống

Tạo menu quán cà phê với switch-case:

  1. Cà phê đen - 15,000đ
  2. Cà phê sữa - 18,000đ
  3. Trà sữa - 25,000đ
  4. Nước cam - 20,000đ
  5. Nước suối - 10,000đ

Tính tổng tiền và áp dụng giảm giá nếu > 50,000đ.

Bài tập 3: Kiểm tra năm nhuận

Viết chương trình kiểm tra năm nhuận:

  • Chia hết cho 4 VÀ (không chia hết cho 100 HOẶC chia hết cho 400)

Bài tập 4: Game đoán số

Viết game đoán số với gợi ý:

  • Máy "nghĩ" một số từ 1-100
  • Người chơi đoán, máy nói "lớn hơn", "nhỏ hơn" hoặc "đúng"

Lời giải chi tiết

Bài tập 1:

cpp
#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "Nhập tuổi: ";
    cin >> age;
    
    if (age < 0) {
        cout << "Tuổi không hợp lệ!" << endl;
    } else if (age <= 2) {
        cout << "Em bé" << endl;
    } else if (age <= 5) {
        cout << "Mầm non" << endl;
    } else if (age <= 10) {
        cout << "Tiểu học" << endl;
    } else if (age <= 14) {
        cout << "THCS" << endl;
    } else if (age <= 17) {
        cout << "THPT" << endl;
    } else if (age <= 22) {
        cout << "Đại học" << endl;
    } else if (age <= 59) {
        cout << "Người lớn" << endl;
    } else {
        cout << "Người cao tuổi" << endl;
    }
    
    return 0;
}

Bài tập 2:

cpp
#include <iostream>
using namespace std;

int main() {
    int choice, quantity;
    double unitPrice, total = 0;
    
    cout << "=== MENU QUÁN CÀ PHÊ ===" << endl;
    cout << "1. Cà phê đen - 15,000đ" << endl;
    cout << "2. Cà phê sữa - 18,000đ" << endl;
    cout << "3. Trà sữa - 25,000đ" << endl;
    cout << "4. Nước cam - 20,000đ" << endl;
    cout << "5. Nước suối - 10,000đ" << endl;
    
    cout << "Chọn đồ uống (1-5): ";
    cin >> choice;
    cout << "Số lượng: ";
    cin >> quantity;
    
    switch (choice) {
        case 1: unitPrice = 15000; break;
        case 2: unitPrice = 18000; break;
        case 3: unitPrice = 25000; break;
        case 4: unitPrice = 20000; break;
        case 5: unitPrice = 10000; break;
        default:
            cout << "Lựa chọn không hợp lệ!" << endl;
            return 1;
    }
    
    total = unitPrice * quantity;
    
    if (total > 50000) {
        total *= 0.9;  // Giảm 10%
        cout << "Được giảm 10%!" << endl;
    }
    
    cout << "Tổng tiền: " << total << "đ" << endl;
    
    return 0;
}

Bài tập 3:

cpp
#include <iostream>
using namespace std;

int main() {
    int year;
    cout << "Nhập năm: ";
    cin >> year;
    
    bool isLeap;
    
    if (year % 4 == 0) {
        if (year % 100 == 0) {
            if (year % 400 == 0) {
                isLeap = true;   // Chia hết cho 400
            } else {
                isLeap = false;  // Chia hết cho 100 nhưng không chia hết cho 400
            }
        } else {
            isLeap = true;       // Chia hết cho 4 nhưng không chia hết cho 100
        }
    } else {
        isLeap = false;          // Không chia hết cho 4
    }
    
    cout << "Năm " << year << (isLeap ? " là" : " không phải") 
         << " năm nhuận" << endl;
    
    return 0;
}

📋 Tóm tắt

🎯 Những gì đã học

  • if-else: Kiểm tra điều kiện, thực thi code tương ứng
  • if-else if-else: Xử lý nhiều điều kiện liên tiếp
  • switch-case: Xử lý nhiều lựa chọn rời rạc, cần break
  • Ternary operator: Viết ngắn gọn cho if-else đơn giản
  • Điều kiện phức hợp: Sử dụng &&, ||, ! để kết hợp điều kiện

🔧 Best Practices

  • Luôn dùng {} cho if, ngay cả khi chỉ có 1 statement
  • Đặt điều kiện thường gặp nhất ở đầu
  • Sử dụng break trong switch-case
  • Viết điều kiện rõ ràng, dễ hiểu
  • Xử lý tất cả các trường hợp có thể xảy ra

🚀 Chuẩn bị cho bước tiếp theo

Bài học tiếp theo sẽ tìm hiểu về vòng lặp (for, while, do-while). Đảm bảo bạn đã:

  • [x] Thành thạo cấu trúc if-else
  • [x] Biết cách sử dụng switch-case đúng cách
  • [x] Hiểu về toán tử logic && || !
  • [x] Có thể viết điều kiện phức hợp

💡 Lời khuyên

"Code rõ ràng quan trọng hơn code thông minh. Hãy viết điều kiện sao cho 6 tháng sau bạn vẫn hiểu!"


Chuyển sang: Vòng lặp để học về for, while, do-while và cách lặp lại code hiệu quả!

Khóa học C++ miễn phí