C++ Control Flow

🔀 Cấu trúc rẽ nhánh if / else

Rẽ nhánh giúp chương trình lựa chọn hành động dựa trên điều kiện. Bài học đi từ biểu thức Boolean, if–else, else-if đến toán tử logic, điều kiện lồng nhau và các lỗi biên thường gặp.

ifChạy khi điều kiện đúng
elseNhánh còn lại
else ifPhân loại nhiều trường hợp
booltrue hoặc false

🎯 Mục tiêu bài học

Cần hiểu

  • Điều kiện là biểu thức cho kết quả true/false.
  • Khác nhau giữa if, if-else và chuỗi else if.
  • Các toán tử so sánh và logic.
  • Thứ tự kiểm tra điều kiện.
  • Điều kiện biên và các trường hợp phủ hết.

Cần làm được

  • Kiểm tra chẵn/lẻ, âm/dương.
  • So sánh hai hoặc ba số.
  • Phân loại điểm.
  • Kết hợp nhiều điều kiện.
  • Tránh lỗi ===.

1. Đặt vấn đề

Bài toán mở đầu.
Một học sinh được công nhận đạt nếu điểm thi từ 5 trở lên. Nếu điểm dưới 5, học sinh chưa đạt. Nhập điểm và in kết quả.

Chương trình không thể luôn in cùng một nội dung. Nó phải kiểm tra:

score ≥ 5 ?

Nếu đúng

Chạy nhánh in Đạt.

Nếu sai

Chạy nhánh in Chưa đạt.

1.1. Mở rộng bài toán

Nếu cần phân loại:

  • Điểm từ 8 đến 10: Giỏi.
  • Điểm từ 6.5 đến dưới 8: Khá.
  • Điểm từ 5 đến dưới 6.5: Đạt.
  • Dưới 5: Chưa đạt.
Lúc này một if-else chưa đủ; cần chuỗi if - else if - else và phải sắp xếp điều kiện đúng thứ tự.

2. Điều kiện và biểu thức Boolean

Toán tửÝ nghĩaVí dụKết quả
==Bằng nhau5 == 5true
!=Khác nhau5 != 3true
>Lớn hơn7 > 4true
<Nhỏ hơn2 < 1false
>=Lớn hơn hoặc bằng5 >= 5true
<=Nhỏ hơn hoặc bằng9 <= 8false
Phân biệt: = là phép gán; == là phép so sánh bằng nhau.

3. Các cấu trúc rẽ nhánh

if đơn

if (temperature < 10) {
    cout << "Mac ao am";
}

Không có hành động riêng khi điều kiện sai.

if – else

if (score >= 5) {
    cout << "Dat";
} else {
    cout << "Chua dat";
}

Chính xác một trong hai nhánh chạy.

else-if chain

if (score >= 8) {
    cout << "Gioi";
} else if (score >= 6.5) {
    cout << "Kha";
} else {
    cout << "Khac";
}

Nhánh đúng đầu tiên được chọn.

4. Mô phỏng cây quyết định

Đọc score, attendance
attendance ≥ 80?
TRUE
score ≥ 5?
FALSE
Không đạt chuyên cần
Đạt
Chưa đạt điểm
cin >> score >> attendance;
if (attendance >= 80) {
if (score >= 5) cout << "Dat";
else cout << "Chua dat diem";
} else cout << "Khong dat chuyen can";

5. Toán tử logic: &&, ||, !

AND – &&

Đúng khi cả hai điều kiện đúng.

age >= 18 && hasId

OR – ||

Đúng khi ít nhất một điều kiện đúng.

isTeacher || isAdmin

NOT – !

Đảo giá trị Boolean.

!isEmpty

Short-circuit

Với &&, nếu vế trái false thì vế phải không cần chạy. Với ||, nếu vế trái true thì vế phải không cần chạy.

5.1. Bảng chân trị tương tác


Ứng dụng short-circuit: i < n && a[i] == x sẽ không truy cập a[i] nếu i >= n.

6. Mô phỏng else-if và thứ tự điều kiện

Thứ tự sai:
if (score >= 5) cout << "Dat";
else if (score >= 8) cout << "Gioi";
Điểm 9 đã thỏa score >= 5, nên nhánh Giỏi không bao giờ được chạy.

7. Phân tích trước khi viết code

BướcCâu hỏiVí dụ phân loại điểm
1. Xác định miền inputGiá trị hợp lệ là gì?0 ≤ score ≤ 10.
2. Liệt kê trường hợpCó bao nhiêu nhánh?Không hợp lệ, Giỏi, Khá, Đạt, Chưa đạt.
3. Xử lý biênĐiểm 5, 6.5, 8 thuộc nhóm nào?Dùng ≥ đúng mốc.
4. Sắp thứ tựĐiều kiện nào phải kiểm tra trước?Từ mốc cao xuống thấp.
5. Kiểm tra phủ hếtCòn trường hợp nào chưa xử lý?Dùng else cho phần còn lại.

8. Code mẫu

#include <bits/stdc++.h>
using namespace std;

int main() {
    int temperature;
    cin >> temperature;

    if (temperature < 10) {
        cout << "Mac ao am";
    }

    return 0;
}
#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n;
    cin >> n;

    if (n % 2 == 0) {
        cout << "So chan";
    } else {
        cout << "So le";
    }
}
#include <bits/stdc++.h>
using namespace std;

int main() {
    double score;
    cin >> score;

    if (score < 0 || score > 10) {
        cout << "Khong hop le";
    } else if (score >= 8) {
        cout << "Gioi";
    } else if (score >= 6.5) {
        cout << "Kha";
    } else if (score >= 5) {
        cout << "Dat";
    } else {
        cout << "Chua dat";
    }
}
#include <bits/stdc++.h>
using namespace std;

int main() {
    long long a, b, c;
    cin >> a >> b >> c;

    long long answer = a;

    if (b > answer) {
        answer = b;
    }

    if (c > answer) {
        answer = c;
    }

    cout << answer;
}
#include <bits/stdc++.h>
using namespace std;

int main() {
    double score;
    int attendance;

    cin >> score >> attendance;

    bool validScore = (0 <= score && score <= 10);
    bool enoughAttendance = (attendance >= 80);
    bool passedExam = (score >= 5);

    if (!validScore) {
        cout << "Du lieu khong hop le";
    } else if (enoughAttendance && passedExam) {
        cout << "Dat";
    } else {
        cout << "Chua dat";
    }
}

9. Giải thích code

9.1. Vì sao chuỗi else-if chỉ chạy một nhánh?

Chương trình kiểm tra từ trên xuống. Khi gặp điều kiện đúng đầu tiên, nó chạy nhánh đó rồi bỏ qua các nhánh còn lại.

9.2. Vì sao phải kiểm tra dữ liệu không hợp lệ trước?

Điểm −1 cũng thỏa điều kiện “dưới 5”, nhưng đây không phải điểm hợp lệ. Cần tách lỗi input khỏi kết quả phân loại.

9.3. Vì sao điều kiện điểm phải sắp từ cao xuống thấp?

Điểm 9 đồng thời thỏa ≥5, ≥6.5 và ≥8. Kiểm tra mốc cao trước để chọn đúng nhóm cụ thể nhất.

9.4. Vì sao max ba số dùng hai if độc lập?

Sau khi so sánh với b, giá trị answer có thể thay đổi; ta vẫn phải tiếp tục so sánh với c. Hai kiểm tra không loại trừ nhau.

9.5. Có viết 0 ≤ x ≤ 10 trong C++ được không?

Không. Biểu thức 0 <= x <= 10 được tính từ trái sang phải và cho kết quả sai về ý nghĩa. Phải viết 0 <= x && x <= 10.

9.6. Có nên luôn dùng dấu ngoặc nhọn?

Nên dùng, kể cả khi nhánh chỉ có một lệnh. Điều này tránh lỗi khi bổ sung câu lệnh và làm rõ else thuộc về if nào.

10. Lỗi thường gặp

  • Dùng = thay cho ==.
  • Viết 0 <= x <= 10.
  • Sắp điều kiện else-if từ rộng đến hẹp.
  • Quên xử lý giá trị biên như 5, 6.5, 8.
  • Đặt dấu chấm phẩy sau if (condition);.
  • Không dùng ngoặc nhọn và khiến else gắn với if gần nhất.
  • So sánh số thực bằng == trong bài cần sai số.
  • Dùng nhiều if độc lập khi các nhánh phải loại trừ nhau.
  • Quên kiểm tra input ngoài miền hợp lệ.

11. Quiz và bài tập

Câu 1. Toán tử so sánh bằng nhau trong C++?
Câu 2. Cách kiểm tra x nằm trong [0,10]?
Câu 3. Trong chuỗi else-if, điều gì xảy ra sau điều kiện đúng đầu tiên?

📘 Cơ bản

  1. Kiểm tra âm, dương hoặc bằng 0.
  2. Kiểm tra chẵn/lẻ.
  3. Tìm max hai số.

📗 Trung bình

  1. Tìm max ba số.
  2. Kiểm tra năm nhuận.
  3. Kiểm tra ba cạnh tạo tam giác.

📙 Nâng cao hơn

  1. Phân loại tam giác.
  2. Tính tiền điện theo bậc.
  3. Kiểm tra ngày tháng hợp lệ.

🐣 Học tiếp

  1. switch-case.
  2. Vòng lặp for/while.
  3. Điều kiện trong thuật toán.