
Buổi 13: Vòng Lặp for Cơ Bản¶
I. Lý Thuyết¶
1. Tại Sao Cần Vòng Lặp?¶
Giả sử bạn cần in ra màn hình câu "Xin chao C++" 10 lần.
Không có vòng lặp, bạn phải copy-paste dòng cout 10 lần. Nếu cần in 1000 lần thì sao? Code sẽ cực kỳ dài và khó sửa.
Vòng lặp giúp thực hiện lặp đi lặp lại một đoạn code nào đó với cú pháp ngắn gọn.
2. Cú Pháp Vòng Lặp for¶
for là vòng lặp phổ biến nhất, thường dùng khi đã biết trước số lần lặp.
Ví dụ:
3. Nguyên Lý Hoạt Động Của for¶
Hãy xem vòng lặp for (int i = 1; i <= 3; i++):
- Bước 1 (Khởi tạo):
int i = 1. (Chỉ chạy 1 lần duy nhất lúc bắt đầu). - Bước 2 (Kiểm tra điều kiện):
i <= 3? - Nếu ĐÚNG \(\to\) chạy code bên trong.
- Nếu SAI \(\to\) kết thúc vòng lặp.
- Bước 3 (Thực thi khối lệnh): Chạy lệnh
cout. - Bước 4 (Bước nhảy):
i++(tăng i lên 1). - Quay lại Bước 2.
Quá trình thực tế:
i = 1,1 <= 3(Đúng) \(\to\) in "Xin chao!" \(\to\)ităng thành 2.i = 2,2 <= 3(Đúng) \(\to\) in "Xin chao!" \(\to\)ităng thành 3.i = 3,3 <= 3(Đúng) \(\to\) in "Xin chao!" \(\to\)ităng thành 4.i = 4,4 <= 3(Sai) \(\to\) DỪNG vòng lặp.
4. Các Biến Thể Của for¶
Lặp lùi (giảm dần):
Bước nhảy lớn hơn 1:
II. Ví Dụ Minh Họa¶
Ví dụ 1: In dãy số từ 1 đến N¶
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Nhap N: "; cin >> n;
cout << "Day so: ";
for (int i = 1; i <= n; i++) {
cout << i << " ";
}
cout << endl;
return 0;
}
Ví dụ 2: Tính tổng \(S = 1 + 2 + 3 + ... + N\)¶
Đây là bài toán kinh điển (bài toán gom bi/cộng dồn).
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Nhap N: "; cin >> n;
int sum = 0; // Biến lưu kết quả, phải khởi tạo = 0
for (int i = 1; i <= n; i++) {
sum = sum + i; // Cộng dồn i vào sum
}
cout << "Tong 1 den " << n << " la: " << sum << endl;
return 0;
}
Ví dụ 3: In các kí tự chữ cái¶
Biến chạy i có thể là kiểu char.
#include <iostream>
using namespace std;
int main() {
cout << "Bang chu cai: ";
for (char c = 'A'; c <= 'Z'; c++) {
cout << c << " ";
}
cout << endl;
return 0;
}
III. Bài Tập Thực Hành Tại Lớp¶
Bài 1: In số chẵn từ 1 đến N¶
Đề bài: Nhập số nguyên N. In ra tất cả các số chẵn trong đoạn từ 1 đến N.
Phân tích đề
Cách 1: for (int i = 1; i <= n; i++) { if (i % 2 == 0) ... }
Cách 2: for (int i = 2; i <= n; i += 2) (Tối ưu hơn)
Gợi ý code
Bài 2: Đếm số lượng ước của N¶
Đề bài: Nhập số nguyên dương N. In ra số lượng ước số của N. (Ước số là số mà N chia hết).
Phân tích đề
- Dùng vòng lặp
for itừ 1 đến N. - Dùng biến
dem = 0. - Cứ mỗi lần
N % i == 0, tăngdem++.
Gợi ý code
IV. Bài Tập Về Nhà¶
Bài 1: Tính tổng các số lẻ từ 1 đến N¶
Đề bài: Nhập số nguyên dương N. Tính và in ra tổng các số lẻ \(\le N\). Ví dụ N=5, Tổng = 1 + 3 + 5 = 9.
Bài 2: Tính Giai Thừa \(N!\)¶
Đề bài: Tính \(N! = 1 \times 2 \times 3 \times ... \times N\).
Lưu ý: Nếu dùng int thì chỉ tính được với \(N\) nhỏ. Nên dùng long long cho kết quả. (Và biến khởi tạo phải là 1, không phải 0).
Bài 3: In các số chia hết cho 3 HOẶC 5¶
Đề bài: Nhập số \(N\). In ra tất cả các số từ 1 đến \(N\) chia hết cho 3 hoặc chia hết cho 5. (Dùng phép toán logic ||).
Bài 4: Bảng Cửu Chương¶
Đề bài: Nhập một số nguyên dương \(N\) (từ 2 đến 9). In ra bảng cửu chương của số \(N\).
V. Ghi Chú Quan Trọng¶
Lỗi Hay Gặp¶
| Lỗi | Mô tả | Cách sửa |
|---|---|---|
| Lặp vô hạn (Infinite loop) | Điều kiện lặp luôn luôn đúng, chương trình không dừng được. Vd: for (int i=1; i>0; i++) |
Kiểm tra lại cẩn thận Điều_kiện_lặp và Bước_nhảy |
| Tính tổng bị sai | Khởi tạo biến lưu tổng bằng giá trị không kiểm soát (hoặc rác bộ nhớ) | LUÔN khai báo int sum = 0; trước khi for |
| Tính tích bị sai | Khởi tạo tích bằng 0 \(\to\) kết quả luôn bằng 0 | Khởi tạo long long tich = 1; |
Sai scope biến i |
Lấy giá trị của i bên ngoài vòng lặp for (biến cục bộ) |
Khai báo int i; bên ngoài for nếu muốn dùng tiếp. |
Tóm Tắt Cú Pháp¶
// Vòng lặp cơ bản 1..N
for (int i = 1; i <= n; i++) { ... }
// Kỹ thuật cộng dồn
long long sum = 0;
for (int i = 1; i <= n; i++) {
sum += i; // tương đương sum = sum + i;
}
VI. Ôn Tập Trắc Nghiệm¶
Hãy làm bài trắc nghiệm để củng cố lý thuyết vòng lặp for: