Bài 3: Câu lệnh điều kiện rẽ nhánh if, else, else if, switch trong C++ và Python
Lời mở đầu
Các chương trình ở bài 2 chạy thẳng một mạch từ trên xuống dưới, lệnh nào cũng được thực hiện. Nhưng ngoài đời mình luôn phải lựa chọn: nếu trời mưa thì mang áo mưa, còn không thì thôi. Trong lập trình, việc lựa chọn đó gọi là rẽ nhánh, và câu lệnh dùng để rẽ nhánh là if. Bài này mình đi từ biểu thức điều kiện, tới if, if – else, chuỗi else if, rồi switch, kèm những lỗi sai mà năm nào học viên của mình cũng mắc.
Lộ trình bài viết, bấm vào từng phần để nhảy tới:
Phần 1Biểu thức điều kiện
Điều kiện là một biểu thức cho kết quả đúng (true) hoặc sai (false), ví dụ $n \gt 0$, $a = b$… Để viết điều kiện ta dùng các toán tử so sánh và toán tử logic:
| Ý nghĩa | Toán học | C++ | Python | Ví dụ (a = 5, b = 3) |
|---|---|---|---|---|
| Bằng | $=$ | a == b | a == b | false |
| Khác | $\ne$ | a != b | a != b | true |
| Lớn hơn / nhỏ hơn | $\gt$ / $\lt$ | a > b / a < b | giống C++ | true / false |
| Lớn hơn hoặc bằng / nhỏ hơn hoặc bằng | $\ge$ / $\le$ | a >= b / a <= b | giống C++ | true / false |
| VÀ: cả 2 cùng đúng | $\land$ | && | and | a > 0 && b > 4 → false |
| HOẶC: ít nhất 1 cái đúng | $\lor$ | || | or | a > 0 || b > 4 → true |
| PHỦ ĐỊNH: đảo đúng ↔ sai | $\lnot$ | ! | not | !(a > b) → false |
= là phép gán (bỏ giá trị vào biến), còn == mới là so sánh bằng. Viết if(n = 5) trong C++ không báo lỗi mà gán luôn n thành 5 và điều kiện luôn đúng, rất khó phát hiện. Python thì báo lỗi cú pháp luôn, đỡ hơn.x >= 1 && x <= 10. Nếu viết 1 <= x <= 10 thì C++ hiểu sai (nó so sánh 1 <= x ra 0 hoặc 1, rồi mới lấy kết quả đó so với 10 nên luôn đúng). Python thì cho phép viết 1 <= x <= 10 đúng như toán học.Phần 2Câu lệnh if và if – else
if(điều_kiện){
// chỉ chạy khi điều kiện ĐÚNG
}
Điều kiện sai thì bỏ qua cả khối lệnh, chạy tiếp lệnh phía sau.if(điều_kiện){
// chạy khi điều kiện ĐÚNG
}
else{
// chạy khi điều kiện SAI
}
Luôn chạy đúng 1 trong 2 khối lệnh.Sơ đồ khối của chương trình kiểm tra chẵn lẻ: hình thoi là điều kiện, chỉ đi theo 1 trong 2 nhánh.
Ví dụ kinh điển: số $n$ chẵn khi chia hết cho 2, tức là $n \% 2 = 0$. Các bạn thử đổi dữ liệu vào để xem chương trình đi nhánh nào:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if(n % 2 == 0){
cout << "CHAN";
}
else{
cout << "LE";
}
return 0;
}
n = int(input())
if n % 2 == 0:
print("CHAN")
else:
print("LE")
Để ý cú pháp Python: không có ngoặc nhọn, sau điều kiện là dấu hai chấm :, các lệnh bên trong thụt lề vào 4 dấu cách. Thụt lề sai là Python báo lỗi hoặc chạy sai luôn.
Dạng thiếu (if không có else) rất hay dùng để cập nhật một giá trị khi gặp trường hợp tốt hơn. Đây chính là ý tưởng tìm số lớn nhất ở bài 1, áp dụng cho 3 số:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
int mx = a;
if(b > mx){
mx = b;
}
if(c > mx){
mx = c;
}
cout << mx;
return 0;
}
a, b, c = map(int, input().split())
mx = a
if b > mx:
mx = b
if c > mx:
mx = c
print(mx)
if chỉ có đúng 1 lệnh thì C++ cho phép bỏ cặp ngoặc { }: if(b > mx) mx = b;. Nhưng từ 2 lệnh trở lên thì bắt buộc phải có ngoặc. Người mới học nên cứ viết ngoặc cho chắc.Mô phỏng trực quan. Đọc code if – else rồi mà vẫn khó hình dung chương trình “rẽ” thế nào? Em bấm Tiếp để đi theo sơ đồ khối của bài chẵn lẻ, rồi đổi n (thử cả số âm) xem đường đi đổi ra sao:
Phần 3Nhiều nhánh với else if và kết hợp điều kiện
Khi có nhiều hơn 2 trường hợp, ta nối các điều kiện bằng else if (Python viết là elif). Máy xét lần lượt từ trên xuống: gặp điều kiện đúng đầu tiên thì chạy nhánh đó rồi bỏ qua toàn bộ phần còn lại; nếu không điều kiện nào đúng thì chạy nhánh else cuối cùng (nếu có).
Ví dụ xếp loại học lực: từ 8 điểm là Giỏi, từ 6.5 là Khá, từ 5 là Trung bình, dưới 5 là Yếu:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
double d;
cin >> d;
if(d >= 8){
cout << "Gioi";
}
else if(d >= 6.5){
cout << "Kha";
}
else if(d >= 5){
cout << "Trung binh";
}
else{
cout << "Yeu";
}
return 0;
}
d = float(input())
if d >= 8:
print("Gioi")
elif d >= 6.5:
print("Kha")
elif d >= 5:
print("Trung binh")
else:
print("Yeu")
else if(d >= 6.5) chỉ được xét khi điều kiện phía trên d >= 8 đã sai, nên ở đó mình ngầm hiểu $d \lt 8$ rồi, không cần viết d >= 6.5 && d < 8. Nhưng nếu đảo thứ tự, đặt d >= 5 lên đầu, thì bạn 9 điểm cũng bị xếp "Trung bình" vì điều kiện đầu tiên đã đúng!Điều kiện phức tạp hơn thì kết hợp bằng &&, ||. Ví dụ năm nhuận theo lịch Gregory: năm chia hết cho 4 nhưng không chia hết cho 100, hoặc chia hết cho 400. Vậy 2024 và 2000 là năm nhuận, còn 1900 và 2026 thì không:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int y;
cin >> y;
bool c1 = (y % 4 == 0 && y % 100 != 0);
bool c2 = (y % 400 == 0);
if(c1 || c2){
cout << "NHUAN";
}
else{
cout << "KHONG NHUAN";
}
return 0;
}
y = int(input())
c1 = (y % 4 == 0 and y % 100 != 0)
c2 = (y % 400 == 0)
if c1 or c2:
print("NHUAN")
else:
print("KHONG NHUAN")
| A | B | A && B (and) | A || B (or) | !A (not) |
|---|---|---|---|---|
| true | true | true | true | false |
| true | false | false | true | false |
| false | true | false | true | true |
| false | false | false | false | true |
if lồng nhau
Bên trong một nhánh của if có thể đặt tiếp một câu lệnh if khác, gọi là if lồng nhau. Ví dụ giải phương trình $ax + b = 0$: phải xét $a = 0$ hay không trước, rồi trong trường hợp $a = 0$ lại xét tiếp $b$ (xem bài tập 2 bên dưới). Nhớ thụt lề cho đúng tầng để đọc code không bị rối.
Vì sao xếp loại học lực phải dùng else if mà không viết mấy lệnh if rời nhau? Em xem hai cách chạy cạnh nhau với cùng một điểm số là thấy ngay sự khác biệt:
Điều kiện năm nhuận có cả && lẫn || nên khá rối. Mô phỏng dưới đây tính từng vế theo đúng thứ tự máy làm, kể cả những vế máy bỏ qua không tính:
Phần 4switch – case, toán tử 3 ngôi và các lỗi hay gặp
Khi cần so sánh một biến với nhiều giá trị cụ thể (1, 2, 3… hoặc 'A', 'B'…), C++ có câu lệnh switch viết gọn hơn chuỗi else if. Ví dụ in tên thứ trong tuần:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
switch(t){
case 2: cout << "Thu Hai"; break;
case 3: cout << "Thu Ba"; break;
case 4: cout << "Thu Tu"; break;
case 5: cout << "Thu Nam"; break;
case 6: cout << "Thu Sau"; break;
case 7: cout << "Thu Bay"; break;
case 8: cout << "Chu Nhat"; break;
default: cout << "Khong hop le";
}
return 0;
}
t = int(input())
match t: # Python 3.10 trở lên
case 2: print("Thu Hai")
case 3: print("Thu Ba")
case 4: print("Thu Tu")
case 5: print("Thu Nam")
case 6: print("Thu Sau")
case 7: print("Thu Bay")
case 8: print("Chu Nhat")
case _: print("Khong hop le")
breakdùng để thoát khỏiswitch. Quên break thì máy chạy "lố" xuống luôn các case bên dưới (ví dụ nhập 2 sẽ in liền "Thu HaiThu Ba…").defaultgiốngelse: chạy khi không khớp case nào.switchchỉ dùng được với số nguyên và ký tự, không dùng với số thực hay xâu.
Toán tử 3 ngôi là cách viết tắt của if – else khi chỉ cần chọn 1 trong 2 giá trị:
Code C++ và Python
int mx = (a > b) ? a : b; // nếu a > b thì mx = a, ngược lại mx = b
mx = a if a > b else b
| Lỗi hay gặp | Viết sai | Viết đúng |
|---|---|---|
| Nhầm gán với so sánh | if(n = 0) | if(n == 0) |
| Thừa dấu ; sau if (khối lệnh luôn chạy dù điều kiện sai) | if(n > 0); cout << "DUONG"; | if(n > 0) cout << "DUONG"; |
| Quên ngoặc khi có 2 lệnh (lệnh thứ 2 luôn chạy) | if(a > b) t = a; a = b; | if(a > b){ t = a; a = b; } |
| Viết khoảng kiểu toán học | if(1 <= x <= 10) | if(x >= 1 && x <= 10) |
| So sánh 2 số thực bằng == | if(0.1 + 0.2 == 0.3) (sai!) | if(fabs(x - y) < 1e-9) |
Bài tậpLuyện câu lệnh rẽ nhánh
Các bài dưới đây đi từ dễ đến khó dần. Nhớ thử với nhiều bộ dữ liệu khác nhau, nhất là các trường hợp đặc biệt (số 0, số âm, các giá trị bằng nhau…) vì đề thi rất hay "gài" vào đó.
Nhập số nguyên $n$. In ra DUONG nếu $n \gt 0$, AM nếu $n \lt 0$, KHONG nếu $n = 0$.
-12AM💡 Gợi ý
if – else if – else. Trường hợp cuối không cần viết điều kiện n == 0 vì không dương, không âm thì chắc chắn bằng 0.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if(n > 0) cout << "DUONG";
else if(n < 0) cout << "AM";
else cout << "KHONG";
return 0;
}
n = int(input())
if n > 0:
print("DUONG")
elif n < 0:
print("AM")
else:
print("KHONG")
Nhập 2 số thực $a, b$. Giải phương trình $ax + b = 0$: in VO NGHIEM, VO SO NGHIEM, hoặc nghiệm $x$ với 2 chữ số thập phân.
2 -42.00💡 Gợi ý
Xem code tham khảo (C++ / Python)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
double a, b;
cin >> a >> b;
if(a == 0){
if(b == 0) cout << "VO SO NGHIEM";
else cout << "VO NGHIEM";
}
else{
double x = -b / a;
cout << fixed << setprecision(2) << x;
}
return 0;
}
a, b = map(float, input().split())
if a == 0:
if b == 0:
print("VO SO NGHIEM")
else:
print("VO NGHIEM")
else:
x = -b / a
print(f"{x:.2f}")
Nhập 3 số nguyên dương $a, b, c$ ($\le 10^9$). In YES nếu đó là 3 cạnh của một tam giác, ngược lại in NO.
3 4 5YES💡 Gợi ý
a + b > c && a + c > b && b + c > a. Vì $a + b$ có thể tới $2 \cdot 10^9$ nên dùng long long cho an toàn. Bạn nào muốn nâng cao có thể đọc bài Bộ số tam giác.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
long long a, b, c;
cin >> a >> b >> c;
if(a + b > c && a + c > b && b + c > a) cout << "YES";
else cout << "NO";
return 0;
}
a, b, c = map(int, input().split())
if a + b > c and a + c > b and b + c > a:
print("YES")
else:
print("NO")
Giá cước taxi: km đầu tiên giá 15 000 đồng; từ km thứ 2 đến km thứ 30 giá 13 500 đồng/km; từ km thứ 31 trở đi giá 11 000 đồng/km. Nhập số km $n$ (nguyên dương), in ra số tiền phải trả.
40516500💡 Gợi ý
Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
long long n;
cin >> n;
long long tien;
if(n <= 1) tien = 15000;
else if(n <= 30) tien = 15000 + (n - 1) * 13500;
else tien = 15000 + 29 * 13500 + (n - 30) * 11000;
cout << tien;
return 0;
}
n = int(input())
if n <= 1:
tien = 15000
elif n <= 30:
tien = 15000 + (n - 1) * 13500
else:
tien = 15000 + 29 * 13500 + (n - 30) * 11000
print(tien)
Nhập tháng $t$ và năm $y$. In ra số ngày của tháng đó.
2 202429💡 Gợi ý
switch rất gọn: nhiều case viết liền nhau case 4: case 6: case 9: case 11: sẽ dùng chung một khối lệnh. Điều kiện năm nhuận lấy ở phần 3.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int t, y;
cin >> t >> y;
switch(t){
case 4: case 6: case 9: case 11:
cout << 30;
break;
case 2:
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) cout << 29;
else cout << 28;
break;
default:
cout << 31;
}
return 0;
}
t, y = map(int, input().split())
if t in (4, 6, 9, 11):
print(30)
elif t == 2:
if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0:
print(29)
else:
print(28)
else:
print(31)
Nhập một ký tự $c$. In ra CHU HOA, CHU THUONG, CHU SO hoặc KHAC.
GCHU HOA💡 Gợi ý
c >= 'A' && c <= 'Z', tương tự với 'a'..'z' và '0'..'9'.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
char c;
cin >> c;
if(c >= 'A' && c <= 'Z') cout << "CHU HOA";
else if(c >= 'a' && c <= 'z') cout << "CHU THUONG";
else if(c >= '0' && c <= '9') cout << "CHU SO";
else cout << "KHAC";
return 0;
}
c = input()[0]
if 'A' <= c <= 'Z':
print("CHU HOA")
elif 'a' <= c <= 'z':
print("CHU THUONG")
elif '0' <= c <= '9':
print("CHU SO")
else:
print("KHAC")
Nhập 3 số nguyên $a, b, c$. In ra 3 số theo thứ tự tăng dần.
5 1 31 3 5💡 Gợi ý
if nối tiếp: nếu $a \gt b$ thì đổi chỗ $a, b$; nếu $a \gt c$ thì đổi chỗ $a, c$ (lúc này $a$ chắc chắn nhỏ nhất); nếu $b \gt c$ thì đổi chỗ $b, c$. Hàm swap(a, b) của C++ đổi chỗ giúp mình. Đây chính là ý tưởng của các thuật toán sắp xếp sau này.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
if(a > b) swap(a, b); // sau lệnh này a <= b
if(a > c) swap(a, c); // sau lệnh này a là nhỏ nhất
if(b > c) swap(b, c); // sau lệnh này b <= c
cout << a << " " << b << " " << c;
return 0;
}
a, b, c = map(int, input().split())
if a > b:
a, b = b, a
if a > c:
a, c = c, a
if b > c:
b, c = c, b
print(a, b, c)
Nhập toạ độ $(x, y)$ của một điểm, biết $x \ne 0$ và $y \ne 0$. In ra điểm đó thuộc góc phần tư thứ mấy (1, 2, 3 hay 4).
-2 42💡 Gợi ý
&&; trường hợp cuối dùng else.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int x, y;
cin >> x >> y;
if(x > 0 && y > 0) cout << 1;
else if(x < 0 && y > 0) cout << 2;
else if(x < 0 && y < 0) cout << 3;
else cout << 4;
return 0;
}
x, y = map(int, input().split())
if x > 0 and y > 0:
print(1)
elif x < 0 and y > 0:
print(2)
elif x < 0 and y < 0:
print(3)
else:
print(4)
Bài tiếp theo (bài 4) là vòng lặp: dạy máy tính làm đi làm lại một việc hàng triệu lần, kết hợp với if của bài này là các bạn đã giải được rất nhiều bài tập rồi đó.
match của Python cần Python 3.10 trở lên.- Không biết học gì trước, học gì sau, học lan man nên kiến thức bị hổng.
- Bí bài không ai gỡ, ngồi cả buổi vẫn không ra rồi bỏ cuộc.
- Code chạy được nhưng không đủ điểm, không biết sai ở đâu, chậm ở đâu.
- Không có đề thi thử và người chấm, nên không biết mình đang ở mức nào.
- Dễ nản giữa chừng khi không có ai theo sát.
- Lộ trình 111 buổi video sắp sẵn từ dòng code đầu tiên đến đề HSG thật của các tỉnh.
- Thầy trực tiếp gỡ bí, chữa bài cho từng em qua nhóm Zalo riêng.
- Hệ thống chấm bài tự động 24/7 và thi thử HSG hằng tuần để biết chính xác mình đang ở đâu.
- Đóng học phí một lần, thầy kèm lâu dài: từ thi chuyên Tin đến HSG quốc gia và cả khi lên đại học.

Nhận xét
Đăng nhận xét