🔀 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.
🎯 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-elsevà chuỗielse 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
=và==.
1. Đặt vấn đề
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:
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.
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ĩa | Ví dụ | Kết quả |
|---|---|---|---|
== | Bằng nhau | 5 == 5 | true |
!= | Khác nhau | 5 != 3 | true |
> | Lớn hơn | 7 > 4 | true |
< | Nhỏ hơn | 2 < 1 | false |
>= | Lớn hơn hoặc bằng | 5 >= 5 | true |
<= | Nhỏ hơn hoặc bằng | 9 <= 8 | false |
= 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
5. Toán tử logic: &&, ||, !
AND – &&
Đúng khi cả hai điều kiện đúng.
age >= 18 && hasIdOR – ||
Đúng khi ít nhất một điều kiện đúng.
isTeacher || isAdminNOT – !
Đảo giá trị Boolean.
!isEmptyShort-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
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
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ước | Câu hỏi | Ví dụ phân loại điểm |
|---|---|---|
| 1. Xác định miền input | Giá trị hợp lệ là gì? | 0 ≤ score ≤ 10. |
| 2. Liệt kê trường hợp | Có 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ết | Cò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?
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
elsegắ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ơ bản
- Kiểm tra âm, dương hoặc bằng 0.
- Kiểm tra chẵn/lẻ.
- Tìm max hai số.
📗 Trung bình
- Tìm max ba số.
- Kiểm tra năm nhuận.
- Kiểm tra ba cạnh tạo tam giác.
📙 Nâng cao hơn
- Phân loại tam giác.
- Tính tiền điện theo bậc.
- Kiểm tra ngày tháng hợp lệ.
🐣 Học tiếp
- switch-case.
- Vòng lặp for/while.
- Điều kiện trong thuật toán.
💳 Quét mã ủng hộ tuỳ tâm nhé!