C03: Điều kiện & Vòng lặp
Bạn sẽ học được: if/else, for, while, switch — kiểm soát luồng chương trình
Yêu cầu: Đã học C02 (Biến, Kiểu dữ liệu)
Thời gian: 60 phút
Tại sao cần điều kiện & vòng lặp?
Analogies: Điều kiện = Ngã rẽ, Vòng lặp = Vòng xoay
flowchart TD
A["Chương trình"] --> B{"Điều kiện?"}
B -->|"Đúng"| C["Làm A"]
B -->|"Sai"| D["Làm B"]
A --> E["Vòng lặp"]
E -->|"Lặp lại"| E
E -->|"Dừng"| F["Kết thúc"]
| Khái niệm |
Analogies |
Ví dụ đời thực |
| Điều kiện |
Ngã rẽ |
Nếu trời mưa → mang ô |
| Vòng lặp |
Vòng xoay |
Đếm từ 1 đến 10 |
| if/else |
Chọn đường |
Nếu đúng → rẽ trái, sai → rẽ phải |
| for |
Đếm số |
Lặp 10 lần |
| while |
Chờ đợi |
Lặp cho đến khi đủ điều kiện |
Điều kiện: if / else if / else
Cú pháp cơ bản
| if (điều_kiện) {
// Code chạy khi điều kiện ĐÚNG
} else if (điều_kiện_2) {
// Code chạy khi điều kiện 2 ĐÚNG
} else {
// Code chạy khi tất cả điều kiện SAI
}
|
Ví dụ 1: Kiểm tra số dương/âm
| int x;
cin >> x;
if (x > 0) {
cout << "So duong" << endl;
} else if (x < 0) {
cout << "So am" << endl;
} else {
cout << "So khong" << endl;
}
|
Ví dụ 2: Kiểm tra chẵn/lẻ
| int n;
cin >> n;
if (n % 2 == 0) {
cout << "Chan" << endl;
} else {
cout << "Le" << endl;
}
|
Hiểu == vs =
== = so sánh (trả về true/false)
= = gán giá trị
| if (x == 5) { ... } // ✅ So sánh x với 5
if (x = 5) { ... } // ❌ Gán x = 5 (luôn đúng!)
|
Ví dụ 3: Kiểm tra năm nhuận
| int year;
cin >> year;
if (year % 400 == 0) {
cout << "Nam nhuan" << endl;
} else if (year % 4 == 0 && year % 100 != 0) {
cout << "Nam nhuan" << endl;
} else {
cout << "Khong nhuan" << endl;
}
|
Toán tử 3 ngôi (Ternary) — Viết ngắn gọn
| // Thay vì:
string result;
if (x > 0) {
result = "Duong";
} else {
result = "Am";
}
// Viết ngắn gọn:
string result = (x > 0) ? "Duong" : "Am";
|
Dùng ternary khi chỉ có 2 trường hợp
Ternary giúp code ngắn gọn hơn, nhưng đừng lạm dụng khi logic phức tạp.
Vòng lặp: for
Cú pháp cơ bản
| for (khởi_tạo; điều_kiện; cập_nhật) {
// Code lặp lại
}
|
Ví dụ 1: Đếm từ 1 đến 10
| for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
// Output: 1 2 3 4 5 6 7 8 9 10
|
Ví dụ 2: Tính tổng 1 đến n
| int n;
cin >> n;
long long sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
cout << sum << endl;
|
Ví dụ 3: Đọc n số và tính tổng
| int n;
cin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
sum += x;
}
cout << sum << endl;
|
Các biến thể của for
| // Đếm từ 0 đến n-1
for (int i = 0; i < n; i++) { ... }
// Đếm từ n-1 đến 0 (đảo ngược)
for (int i = n - 1; i >= 0; i--) { ... }
// Đếm từ 1 đến n, bước nhảy 2
for (int i = 1; i <= n; i += 2) { ... }
// Đếm từ 0 đến n, bước nhảy 3
for (int i = 0; i <= n; i += 3) { ... }
|
Vòng lặp for với mảng
| int a[] = {1, 2, 3, 4, 5};
int n = 5;
// Cách 1: Dùng chỉ số
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
// Cách 2: Dùng range-based for (C++11)
for (int x : a) {
cout << x << " ";
}
|
Vòng lặp: while
Cú pháp cơ bản
| while (điều_kiện) {
// Code lặp lại cho đến khi điều kiện SAI
}
|
Ví dụ 1: Đếm ngược
| int n = 10;
while (n > 0) {
cout << n << " ";
n--;
}
// Output: 10 9 8 7 6 5 4 3 2 1
|
Ví dụ 2: Đọc cho đến khi gặp 0
| int x;
while (cin >> x && x != 0) {
cout << x << endl;
}
|
Ví dụ 3: Tính số chữ số
| int n;
cin >> n;
int count = 0;
while (n > 0) {
n /= 10;
count++;
}
cout << count << endl;
|
Vòng lặp: do-while
Cú pháp cơ bản
| do {
// Code lặp lại
} while (điều_kiện); // Chú ý: có dấu chấm phẩy
|
| int choice;
do {
cout << "1. Choi game" << endl;
cout << "2. Xem diem" << endl;
cout << "3. Thoat" << endl;
cout << "Chon: ";
cin >> choice;
if (choice == 1) cout << "Dang choi..." << endl;
else if (choice == 2) cout << "Diem: 100" << endl;
} while (choice != 3);
|
while vs do-while
while: Kiểm tra điều kiện trước khi lặp (có thể không chạy lần nào)
do-while: Kiểm tra điều kiện sau khi lặp (chạy ít nhất 1 lần)
break & continue
break — Thoát khỏi vòng lặp
| for (int i = 1; i <= 10; i++) {
if (i == 5) break; // Dừng khi i = 5
cout << i << " ";
}
// Output: 1 2 3 4
|
continue — Bỏ qua lần lặp hiện tại
| for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) continue; // Bỏ qua số chẵn
cout << i << " ";
}
// Output: 1 3 5 7 9
|
Khi nào dùng break/continue?
break: Khi muốn thoát sớm khỏi vòng lặp
continue: Khi muốn bỏ qua một số trường hợp
Vòng lặp lồng nhau
Ví dụ 1: In bảng cửu chương
| for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 10; j++) {
cout << i << " x " << j << " = " << i * j << endl;
}
cout << endl;
}
|
Ví dụ 2: Duyệt ma trận
| int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
|
Ví dụ 3: Tìm số lớn nhất trong mảng
| int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
int maxVal = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > maxVal) maxVal = a[i];
}
cout << maxVal << endl;
|
switch — Chọn theo giá trị
Cú pháp cơ bản
| switch (biến) {
case giá_trị_1:
// Code khi biến = giá trị 1
break;
case giá_trị_2:
// Code khi biến = giá trị 2
break;
default:
// Code khi không khớp case nào
break;
}
|
Ví dụ: Ngày trong tuần
| int day;
cin >> day;
switch (day) {
case 1: cout << "Thu hai" << endl; break;
case 2: cout << "Thu ba" << endl; break;
case 3: cout << "Thu tu" << endl; break;
case 4: cout << "Thu nam" << endl; break;
case 5: cout << "Thu sau" << endl; break;
case 6: cout << "Thu bay" << endl; break;
case 7: cout << "Chu nhat" << endl; break;
default: cout << "Khong hop le" << endl; break;
}
|
Quên break
| // ❌ SAI: Quên break
switch (x) {
case 1: cout << "Mot"; // Sẽ chạy tiếp case 2!
case 2: cout << "Hai"; break;
}
// ✅ ĐÚNG
switch (x) {
case 1: cout << "Mot"; break;
case 2: cout << "Hai"; break;
}
|
Common Mistakes — Lỗi thường gặp
Lỗi 1: Dùng = thay vì ==
| // ❌ SAI
if (x = 5) { ... } // Gán x = 5, luôn đúng!
// ✅ ĐÚNG
if (x == 5) { ... }
|
Lỗi 2: Quên dấu {}
| // ❌ SAI: Chỉ có 1 dòng trong if
if (x > 0)
cout << "Duong";
cout << "So lon"; // Dòng này luôn chạy!
// ✅ ĐÚNG
if (x > 0) {
cout << "Duong";
cout << "So lon";
}
|
Lỗi 3: Vòng lặp vô hạn
| // ❌ SAI: i không bao giờ thay đổi
int i = 0;
while (i < 10) {
cout << i << " ";
// Quên i++ → lặp vô hạn!
}
// ✅ ĐÚNG
int i = 0;
while (i < 10) {
cout << i << " ";
i++;
}
|
Lỗi 4: Tràn số khi tính tổng
| // ❌ SAI: sum có thể tràn
int sum = 0;
for (int i = 1; i <= 1000000; i++) sum += i;
// ✅ ĐÚNG
long long sum = 0;
for (int i = 1; i <= 1000000; i++) sum += i;
|
Bài tập thực hành
Bài 1: Kiểm tra số chẵn/lẻ
Đọc số nguyên n. In ra "Chan" nếu n chẵn, "Le" nếu n lẻ.
Input: 7
Output: Le
Lời giải
| #include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
if (n % 2 == 0) cout << "Chan" << endl;
else cout << "Le" << endl;
return 0;
}
|
Bài 2: Tính tổng 1 đến n
Đọc số nguyên n. Tính tổng 1 + 2 + ... + n.
Input: 100
Output: 5050
Lời giải
| #include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
long long sum = 0;
for (int i = 1; i <= n; i++) sum += i;
cout << sum << endl;
return 0;
}
|
Bài 3: Đếm số chữ số
Đọc số nguyên n. Đếm số chữ số của n.
Input: 12345
Output: 5
Lời giải
| #include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int count = 0;
while (n > 0) {
n /= 10;
count++;
}
cout << count << endl;
return 0;
}
|
Bài 4: In tam giác sao
Đọc số nguyên n. In tam giác sao có n hàng.
Input: 5
Output:
Lời giải
| #include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) cout << "*";
cout << endl;
}
return 0;
}
|
Tóm tắt bài học
| Nội dung |
Chi tiết |
| if/else |
Kiểm tra điều kiện, chọn nhánh |
| for |
Lặp khi biết trước số lần |
| while |
Lặp khi không biết trước số lần |
| do-while |
Lặp ít nhất 1 lần |
| break |
Thoát khỏi vòng lặp |
| continue |
Bỏ qua lần lặp hiện tại |
| switch |
Chọn theo giá trị |
Bài viết liên quan
Bài tiếp theo: C04: Mảng & Vector →