CÂU LỆNH RẼ NHÁNH TRONG C++
Chào các bạn học sinh và lập trình viên! Khi giải quyết các bài toán thực tế trên Sen Code Online Judge!, không phải lúc nào chương trình cũng thực thi một cách tuần tự từ trên xuống dưới. Rất nhiều trường hợp chúng ta cần đưa ra các quyết định: "Nếu điều kiện này đúng thì làm việc này, ngược lại thì làm việc kia".
Để làm được việc đó, C++ cung cấp các cấu trúc rẽ nhánh bao gồm câu lệnh if (dạng thiếu và dạng đủ) và câu lệnh lựa chọn switch-case. Bài viết này sẽ hướng dẫn chi tiết cú pháp và cách áp dụng cụ thể.
1. Biểu thức điều kiện và Phép toán logic
Trước khi tìm hiểu cú pháp rẽ nhánh, chúng ta cần biết cách xây dựng một Điều kiện (thường trả về giá trị kiểu logic bool là true hoặc false).
Các phép so sánh cơ bản:
==(So sánh bằng - chú ý dùng hai dấu bằng liên tiếp)!=(So sánh khác)<(Nhỏ hơn),>(Lớn hơn)<=(Nhỏ hơn hoặc bằng),>=(Lớn hơn hoặc bằng)
Các phép toán logic (Kết hợp nhiều điều kiện):
&&(Phép VÀ - And): Trả vềtruekhi tất cả các điều kiện thành phần đều đúng.||(Phép HOẶC - Or): Trả vềtruekhi chỉ cần ít nhất một điều kiện thành phần đúng.!(Phép PHỦ ĐỊNH - Not): Đảo ngược trạng thái đúng/sai của điều kiện.
2. Câu lệnh if dạng thiếu
Khái niệm:
Câu lệnh if dạng thiếu được dùng khi chúng ta chỉ muốn thực hiện một hành động nào đó khi điều kiện thỏa mãn. Nếu điều kiện không thỏa mãn, chương trình bỏ qua hành động đó và chạy tiếp đoạn mã phía sau.
Cú pháp:
if (điều_kiện) {
// Khối lệnh được thực thi nếu điều_kiện đúng (true)
}
Lưu ý: Nếu khối lệnh chỉ gồm 1 câu lệnh duy nhất, ta có thể bỏ cặp ngoặc nhọn {}. Tuy nhiên, khuyến khích các bạn học sinh luôn viết đầy đủ cặp ngoặc nhọn để code rõ ràng và tránh lỗi logic.
Ví dụ minh họa:
Một cửa hàng có chương trình khuyến mãi: Khách hàng mua đơn hàng có giá trị từ 500.000 đồng trở lên sẽ được giảm giá ngay 50.000 đồng.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long long triGiaDonHang;
cin >> triGiaDonHang; // Nhập giá trị đơn hàng
// Câu lệnh if dạng thiếu
if (triGiaDonHang >= 500000) {
triGiaDonHang -= 50000; // Giảm giá 50.000đ nếu đủ điều kiện
}
cout << "So tien thuc te can thanh toan: " << triGiaDonHang << "\n";
return 0;
}
3. Câu lệnh if dạng đủ (và dạng nhiều nhánh)
1. Câu lệnh if - else (Dạng đủ)
Dùng khi chúng ta có 2 phương án lựa chọn loại trừ lẫn nhau. Nếu điều kiện đúng thì làm việc A, ngược lại (điều kiện sai) thì làm việc B.
Cú pháp:
if (điều_kiện) {
// Khối lệnh thực thi khi điều_kiện đúng
} else {
// Khối lệnh thực thi khi điều_kiện sai
}
Ví dụ minh họa:
Nhập vào một số nguyên dương N. Kiểm tra và in ra màn hình số đó là số chẵn hay số lẻ.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
// Kiểm tra chia hết cho 2
if (N % 2 == 0) {
cout << N << " la so chan.\n";
} else {
cout << N << " la so le.\n";
}
return 0;
}
2. Câu lệnh if - else if - else (Nhiều nhánh)
Dùng khi bài toán có nhiều hơn 2 điều kiện và các điều kiện này loại trừ lẫn nhau (chỉ duy nhất một nhánh được thực thi).
Cú pháp:
if (điều_kiện_1) {
// Chạy khi điều_kiện_1 đúng
} else if (điều_kiện_2) {
// Chạy khi điều_kiện_1 sai và điều_kiện_2 đúng
} else if (điều_kiện_3) {
// Chạy khi các điều kiện trên sai và điều_kiện_3 đúng
} else {
// Chạy khi tất cả các điều kiện trên đều sai (không bắt buộc có)
}
Ví dụ minh họa:
So sánh hai số nguyên A và B nhập từ bàn phím.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int A, B;
cin >> A >> B;
if (A > B) {
cout << "A lon hon B\n";
} else if (A < B) {
cout << "A nho hon B\n";
} else {
cout << "A bang B\n";
}
return 0;
}
4. Câu lệnh lựa chọn switch-case
Khái niệm:
Câu lệnh switch được dùng để rẽ nhánh chương trình dựa trên giá trị cụ thể của một biểu thức nguyên (kiểu int, char, bool). Nó giúp thay thế cấu trúc if-else quá dài khi so sánh bằng với các giá trị hằng số cụ thể.
Cú pháp:
switch (biểu_thức_nguyên) {
case giá_trị_1:
// Khối lệnh 1
break; // Thoát khỏi cấu trúc switch
case giá_trị_2:
// Khối lệnh 2
break;
...
default:
// Khối lệnh mặc định chạy khi không khớp bất kỳ giá trị nào ở trên
break;
}
Các quy tắc cốt lõi của switch-case:
- Giá trị sau từ khóa
casephải là một hằng số cụ thể (như1,2,'A', v.v.) và không được trùng nhau. Không được chứa biến hay điều kiện so sánh lớn nhỏ ở đây. - Từ khóa
breakcực kỳ quan trọng: Sau khi thực hiện xong các câu lệnh của mộtcase, nếu không có lệnhbreak, chương trình sẽ tự động trôi tuột xuống và thực hiện tiếp các câu lệnh củacasengay phía dưới mà không cần kiểm tra lại điều kiện (gọi là hiện tượng Fall-through). - Nhãn
defaulttương đương với nhánhelsetrong cấu trúcif-else, nó sẽ được gọi khi biểu thức nguyên không khớp với bất kỳcasenào đã khai báo.
Ví dụ minh họa:
Viết chương trình nhập vào một số nguyên đại diện cho thứ trong tuần (từ 2 đến 8). In ra tên thứ tương ứng bằng tiếng Việt. Nếu nhập ngoài khoảng này, thông báo lỗi.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int thu;
cin >> thu;
switch (thu) {
case 2:
cout << "Thu Hai\n";
break;
case 3:
cout << "Thu Ba\n";
break;
case 4:
cout << "Thu Tu\n";
break;
case 5:
cout << "Thu Nam\n";
break;
case 6:
cout << "Thu Sau\n";
break;
case 7:
cout << "Thu Bay\n";
break;
case 8:
cout << "Chu Nhat\n";
break;
default:
cout << "Gia tri nhap vao khong hop le!\n";
break;
}
return 0;
}
5. ĐỀ XUẤT 10 BÀI TẬP THỰC HÀNH THỰC TẾ (CẤU TRÚC RẼ NHÁNH)
Để rèn luyện kỹ năng đọc hiểu đề bài và kỹ năng rẽ nhánh điều kiện, dưới đây là 10 bài toán thực tế chuẩn phong cách Lập trình thi đấu:
Bài 1: Xét tuyển học bổng học sinh giỏi
- Ngữ cảnh: Một trường THPT xét học bổng cho học sinh dựa trên hai tiêu chí: Điểm trung bình học tập (GPA) và Điểm rèn luyện (RL). Học sinh đạt học bổng nếu điểm GPA từ 8.0 trở lên VÀ điểm rèn luyện từ 80 trở lên.
- Yêu cầu: Cho biết học sinh đó có đạt học bổng hay không.
- Đầu vào (Input): Một dòng gồm hai số thực G và R tương ứng là điểm GPA và điểm rèn luyện (0.0 <= G <= 10.0, 0 <= R <= 100).
- Đầu ra (Output): In ra
YESnếu học sinh được nhận học bổng, ngược lại in raNO. - Ví dụ:
- Input:
8.2 85 - Output:
YES
- Input:
Bài 2: Tính cước phí xe công nghệ
- Ngữ cảnh: Hãng xe công nghệ SenCar áp dụng bảng giá cước cho khách hàng đi xe dựa trên quãng đường di chuyển d (km) như sau:
- 1 km đầu tiên có giá cố định là 15.000 đồng.
- Từ km thứ 2 đến km thứ 10 có giá 13.500 đồng cho mỗi km.
- Từ km thứ 11 trở đi có giá 11.000 đồng cho mỗi km.
- Yêu cầu: Tính tổng số tiền khách hàng phải trả khi đi quãng đường d km (d có thể là số lẻ thập phân).
- Đầu vào (Input): Một số thực dương d biểu thị số km di chuyển (0 < d <= 100.0).
- Đầu ra (Output): Một số thực duy nhất là số tiền cước phải trả (lấy đúng 1 chữ số thập phân).
- Ví dụ:
- Input:
12.5 - Output:
164000.0(Tính bằng: 115000 + 913500 + 2.511000 = 15000 + 121500 + 27500 = 164000)*
- Input:
Bài 3: Phân loại tam giác hình học
- Ngữ cảnh: Cho ba số nguyên dương đại diện cho độ dài ba cạnh.
- Yêu cầu: Kiểm tra xem ba cạnh này có tạo thành một tam giác hợp lệ hay không. Nếu có, hãy phân loại cụ thể xem đó là tam giác đều, tam giác cân, tam giác vuông hay tam giác thường.
- Đầu vào (Input): Ba số nguyên dương a, b, c (1 <= a, b, c <= 104).
- Đầu ra (Output):
- Nếu không tạo thành tam giác, in ra
KHONG PHAI TAM GIAC. - Nếu hợp lệ, lần lượt in ra loại tam giác tương ứng:
TAM GIAC DEU,TAM GIAC CAN,TAM GIAC VUONGhoặcTAM GIAC THUONG.
- Nếu không tạo thành tam giác, in ra
- Ví dụ:
- Input:
3 4 5 - Output:
TAM GIAC VUONG
- Input:
Bài 4: Kiểm tra năm nhuận lịch thế kỷ
- Ngữ cảnh: Một năm dương lịch Y được coi là năm nhuận nếu nó thỏa mãn một trong hai điều kiện sau:
- Chia hết cho 400.
- Chia hết cho 4 nhưng không chia hết cho 100.
- Yêu cầu: Kiểm tra xem năm Y nhập vào từ bàn phím có phải là năm nhuận không.
- Đầu vào (Input): Một số nguyên dương Y (1 <= Y <= 105).
- Đầu ra (Output): In ra
YESnếu năm Y là năm nhuận, ngược lại in raNO. - Ví dụ:
- Input:
2000 - Output:
YES
- Input:
Bài 5: Định giá vé công viên nước cuối tuần
- Ngữ cảnh: Giá vé vào cổng công viên nước được quy định dựa trên chiều cao của khách hàng:
- Trẻ em dưới 100 cm: Được miễn phí vé hoàn toàn.
- Khách hàng cao từ 100 cm đến 140 cm: Giá vé là 100.000 đồng.
- Khách hàng cao trên 140 cm: Giá vé là 150.000 đồng.
- Nếu ngày đi là ngày cuối tuần (thứ Bảy hoặc Chủ Nhật), giá vé sẽ phụ thu thêm 20% trên giá vé gốc.
- Yêu cầu: Tính tiền vé mà một khách hàng cần trả.
- Đầu vào (Input): Một dòng gồm số nguyên H biểu thị chiều cao (cm) và số nguyên T biểu thị thứ trong tuần (từ 2 đến 8, với 8 là Chủ Nhật).
- Đầu ra (Output): Một số nguyên duy nhất là số tiền vé phải trả.
- Ví dụ:
- Input:
125 7 - Output:
120000(Chiều cao 125cm vé gốc là 100.000đ, đi vào thứ 7 được phụ thu thêm 20% -> 120.000đ)
- Input:
Bài 6: Đánh giá phân loại học lực học sinh
- Ngữ cảnh: Giáo viên chủ nhiệm cần xếp loại học sinh dựa vào điểm trung bình (ĐTB) cả năm của các em theo thang điểm 10:
- ĐTB từ 8.0 trở lên: Loại
GIOI - ĐTB từ 6.5 đến dưới 8.0: Loại
KHA - ĐTB từ 5.0 đến dưới 6.5: Loại
TRUNG BINH - ĐTB dưới 5.0: Loại
YEU
- ĐTB từ 8.0 trở lên: Loại
- Yêu cầu: Xếp loại học lực của học sinh.
- Đầu vào (Input): Một số thực duy nhất ĐTB (0.0 <= ĐTB <= 10.0).
- Đầu ra (Output): Một dòng chữ in hoa là học lực tương ứng của học sinh.
- Ví dụ:
- Input:
7.95 - Output:
KHA
- Input:
Bài 7: Thiết kế máy tính điện tử bỏ túi
- Ngữ cảnh: Bạn cần thiết kế bộ xử lý logic cho một máy tính cầm tay mini nhận lệnh tính toán cơ bản của hai số nguyên A và B thông qua một ký tự phép toán.
- Yêu cầu: Nhận vào hai số nguyên A, B và một ký tự toán tử
op(thuộc tập hợp+,-,*,/). Thực hiện phép tính tương ứng. Nếu phép toán là chia và số B bằng 0, đưa ra cảnh báo lỗi. - Đầu vào (Input): Một dòng gồm số nguyên A, ký tự
opvà số nguyên B (B tuyệt đối không quá 109). - Đầu ra (Output):
- Nếu phép toán hợp lệ, in ra kết quả số nguyên (nếu phép chia nguyên
/thì chỉ lấy phần nguyên). - Nếu chia cho 0, in ra
ERROR.
- Nếu phép toán hợp lệ, in ra kết quả số nguyên (nếu phép chia nguyên
- Ví dụ:
- Input:
10 / 3 - Output:
3
- Input:
Bài 8: Xác định tọa độ góc phần tư GPS
- Ngữ cảnh: Trong hệ thống định vị robot di chuyển trên mặt phẳng Oxy, cảm biến trả về vị trí robot là điểm M(x, y).
- Yêu cầu: Xác định điểm M nằm ở góc phần tư thứ mấy (I, II, III hoặc IV). Nếu điểm nằm trên các trục tọa độ hoặc gốc tọa độ thì thông báo cụ thể.
- Đầu vào (Input): Hai số nguyên x và y cách nhau bởi dấu cách (-109 <= x, y <= 109).
- Đầu ra (Output):
- Robot ở gốc tọa độ, in ra
ORIGIN. - Robot trên trục hoành (Ox), in ra
OX; trên trục tung (Oy), in raOY. - Robot ở các góc phần tư tương ứng, lần lượt in ra
I,II,IIIhoặcIV.
- Robot ở gốc tọa độ, in ra
- Ví dụ:
- Input:
-5 10 - Output:
II
- Input:
Bài 9: Đếm số ngày trong tháng dương lịch
- Ngữ cảnh: Một lịch biểu máy tính cần biết số lượng ngày chính xác của một tháng M trong năm Y cho trước.
- Yêu cầu: Cho biết số ngày của tháng M trong năm Y. Chú ý năm nhuận có tháng 2 sở hữu 29 ngày.
- Đầu vào (Input): Một dòng gồm hai số nguyên dương M và Y (1 <= M <= 12, 1 <= Y <= 105).
- Đầu ra (Output): Một số nguyên duy nhất là số ngày của tháng đó.
- Ví dụ:
- Input:
2 2024 - Output:
29
- Input:
Bài 10: Trò chơi Oẳn Tù Tì đối kháng
- Ngữ cảnh: Hai học sinh A và B chơi oẳn tù tì để phân định thắng thua. Mỗi người chọn một trong ba ký tự đại diện:
K(Kéo),B(Búa),G(Giấy). - Quy tắc: Búa thắng Kéo, Kéo thắng Giấy, Giấy thắng Búa.
- Yêu cầu: Xác định kết quả của trò chơi xem ai là người chiến thắng hoặc có kết quả hòa.
- Đầu vào (Input): Một dòng gồm hai ký tự cách nhau bởi khoảng trắng, ký tự thứ nhất là lựa chọn của A, ký tự thứ hai là lựa chọn của B (chỉ nhận
K,BhoặcG). - Đầu ra (Output):
- Nếu A thắng, in ra
A WIN. - Nếu B thắng, in ra
B WIN. - Nếu hai bạn chọn giống nhau, in ra
DRAW.
- Nếu A thắng, in ra
- Ví dụ:
- Input:
K G - Output:
A WIN
- Input:
Lời kết
Làm chủ câu lệnh rẽ nhánh if-else và switch-case giúp bạn giải quyết được hầu hết các tình huống điều kiện phức tạp trong đời sống thực tế khi lập trình. Hãy vận dụng tư duy logic để xây dựng các biểu thức so sánh thật chính xác!
Hãy thực hành lập trình và gửi bài giải của 10 bài tập rẽ nhánh trên tại hệ thống Sen Code Online Judge! nhé! Chúc các bạn học tập thật tốt!
Bình luận