Bài 7.1: Bài tập thực hành vòng lặp for trong C++

Bài 7.1: Bài tập thực hành vòng lặp for trong C++
Chào mừng bạn trở lại với chuỗi bài học C++ của FullhouseDev! Hôm nay, chúng ta sẽ đi sâu vào một trong những cấu trúc điều khiển luồng quan trọng và được sử dụng nhiều nhất trong lập trình: vòng lặp for
. Nếu bạn đã từng gặp phải tình huống cần lặp đi lặp lại một đoạn code nhiều lần, thì for
chính là người bạn đồng hành đáng tin cậy của bạn.
Vòng lặp for
đặc biệt hữu ích khi bạn biết trước hoặc có thể tính toán được số lần lặp mà bạn cần thực hiện. Nó cung cấp một cách ngắn gọn và có cấu trúc để quản lý quá trình lặp, giúp code của bạn sạch sẽ và dễ đọc hơn rất nhiều so với việc viết lặp lại cùng một dòng code!
Cấu trúc "Ma Thuật" của Vòng lặp for
Vòng lặp for
trong C++ có một cấu trúc rất rõ ràng, gồm ba phần chính được phân cách bởi dấu chấm phẩy (;
) bên trong cặp ngoặc đơn ()
:
for (khởi tạo; điều kiện; cập nhật) {
// Đoạn mã sẽ được thực thi lặp đi lặp lại
}
Hãy "giải mã" từng phần:
khởi tạo
(Initialization): Phần này được thực thi chỉ một lần duy nhất khi vòng lặp bắt đầu. Thường được dùng để khai báo và gán giá trị ban đầu cho biến đếm của vòng lặp. Biến này chỉ tồn tại trong phạm vi của vòng lặpfor
(nếu được khai báo ngay tại đây).điều kiện
(Condition): Phần này được kiểm tra trước mỗi lần lặp. Nếuđiều kiện
làtrue
, đoạn mã bên trong vòng lặp sẽ được thực thi. Nếuđiều kiện
làfalse
, vòng lặp sẽ dừng lại và chương trình tiếp tục thực thi các dòng mã ngay sau vòng lặp.cập nhật
(Update): Phần này được thực thi sau mỗi lần lặp hoàn thành. Thường được dùng để tăng hoặc giảm giá trị của biến đếm, đảm bảo rằng điều kiện lặp cuối cùng sẽ trở thànhfalse
để vòng lặp kết thúc (nếu không, bạn sẽ có một vòng lặp vô hạn!).
Nghe có vẻ hơi lý thuyết? Đừng lo, chúng ta sẽ đi ngay vào các ví dụ thực tế để thấy for
hoạt động như thế nào!
Các Ví dụ Thực Hành với Vòng lặp for
Ví dụ 1: Đếm số từ 1 đến 10
Đây là ví dụ "kinh điển" nhất để bắt đầu. Chúng ta sẽ sử dụng vòng lặp for
để in ra các số nguyên từ 1 đến 10.
#include <iostream>
int main() {
cout << "Cac so tu 1 den 10:" << endl;
for (int i = 1; i <= 10; ++i) {
cout << i << " "; // In so i va mot khoang cach
}
cout << endl; // Xuong dong sau khi in xong
return 0;
}
Giải thích:
int i = 1;
: Khởi tạo biến đếmi
với giá trị ban đầu là 1. Biếni
chỉ "sống" trong vòng lặp này.i <= 10;
: Điều kiện lặp. Vòng lặp sẽ tiếp tục chạy chừng nào giá trị củai
còn nhỏ hơn hoặc bằng 10.++i;
: Cập nhật biến đếm. Sau mỗi lần lặp, giá trị củai
tăng lên 1. Chúng ta dùng++i
(tiền tố tăng) hoặci++
(hậu tố tăng) đều được trong trường hợp này, kết quả lài
tăng 1.cout << i << " ";
: Đoạn code bên trong thân vòng lặp. Lệnh này sẽ được thực thi 10 lần, lần lượt in ra giá trị củai
từ 1 đến 10, mỗi số cách nhau bởi một khoảng trắng.
Kết quả chạy chương trình sẽ là: Cac so tu 1 den 10: 1 2 3 4 5 6 7 8 9 10
Ví dụ 2: Đếm ngược từ 10 về 1
Vòng lặp for
cũng rất linh hoạt để đếm ngược. Chúng ta chỉ cần thay đổi phần khởi tạo, điều kiện và cập nhật cho phù hợp.
#include <iostream>
int main() {
cout << "Dem nguoc tu 10 ve 1:" << endl;
for (int i = 10; i >= 1; --i) {
cout << i << " ";
}
cout << endl;
return 0;
}
Giải thích:
int i = 10;
: Khởi tạo biến đếmi
với giá trị ban đầu là 10.i >= 1;
: Điều kiện lặp. Vòng lặp tiếp tục khii
còn lớn hơn hoặc bằng 1.--i;
: Cập nhật biến đếm. Sau mỗi lần lặp, giá trị củai
giảm đi 1. Chúng ta dùng--i
(tiền tố giảm) hoặci--
(hậu tố giảm).
Kết quả chạy chương trình sẽ là: Dem nguoc tu 10 ve 1: 10 9 8 7 6 5 4 3 2 1
Ví dụ 3: Lặp với bước nhảy tùy ý (In số chẵn)
Không chỉ tăng giảm 1 đơn vị, bạn hoàn toàn có thể thay đổi bước nhảy của biến đếm trong phần cập nhật. Hãy in các số chẵn từ 0 đến 20.
#include <iostream>
int main() {
cout << "Cac so chan tu 0 den 20:" << endl;
for (int i = 0; i <= 20; i += 2) { // i += 2 tuong duong voi i = i + 2
cout << i << " ";
}
cout << endl;
return 0;
}
Giải thích:
int i = 0;
: Bắt đầu từ 0.i <= 20;
: Lặp cho đến khii
vượt quá 20.i += 2;
: Cập nhật. Sau mỗi lần lặp,i
tăng thêm 2 đơn vị. Điều này giúp chúng ta nhảy qua các số lẻ và chỉ lấy các số chẵn.
Kết quả chạy chương trình sẽ là: Cac so chan tu 0 den 20: 0 2 4 6 8 10 12 14 16 18 20
Ví dụ 4: Tính tổng các số từ 1 đến N
Vòng lặp for
rất mạnh mẽ khi kết hợp với các biến khác để thực hiện tính toán hoặc xử lý dữ liệu. Hãy viết chương trình tính tổng các số nguyên từ 1 đến một số N
nào đó do người dùng nhập vào.
#include <iostream>
int main() {
int n;
cout << "Nhap mot so nguyen duong N: ";
cin >> n;
int sum = 0; // Bien de luu tong, khoi tao bang 0
// Vong lap de cong don cac so tu 1 den N
for (int i = 1; i <= n; ++i) {
sum += i; // Tuong duong voi sum = sum + i;
}
cout << "Tong cac so tu 1 den " << n << " la: " << sum << endl;
return 0;
}
Giải thích:
- Chúng ta khai báo biến
n
để nhận giá trị nhập từ người dùng và biếnsum
, khởi tạo bằng 0, để lưu trữ tổng. - Vòng lặp
for
chạy từi = 1
đếni = n
. - Bên trong vòng lặp, lệnh
sum += i;
sẽ liên tục cộng giá trị hiện tại củai
vào biếnsum
.- Lần lặp 1:
sum
= 0 + 1 = 1 - Lần lặp 2:
sum
= 1 + 2 = 3 - Lần lặp 3:
sum
= 3 + 3 = 6 - ... cho đến khi
i
bằngn
.
- Lần lặp 1:
- Sau khi vòng lặp kết thúc (khi
i
vượt quán
), biếnsum
sẽ chứa tổng của tất cả các số từ 1 đếnn
.
Nếu bạn nhập N = 5, kết quả sẽ là: Tong cac so tu 1 den 5 la: 15
(vì 1+2+3+4+5 = 15).
Ví dụ 5: Vòng lặp for
lồng nhau (Nested for
Loops)
Bạn hoàn toàn có thể đặt một vòng lặp for
bên trong một vòng lặp for
khác. Đây gọi là vòng lặp lồng nhau. Kỹ thuật này rất hữu ích khi làm việc với các cấu trúc hai chiều như ma trận hoặc in các mẫu hình học.
Hãy cùng in một hình chữ nhật bằng các ký tự *
.
#include <iostream>
int main() {
int rows = 4; // So dong
int cols = 7; // So cot
cout << "Hinh chu nhat kich thuoc " << rows << "x" << cols << ":" << endl;
// Vong lap ngoai dieu khien so dong
for (int i = 0; i < rows; ++i) {
// Vong lap ben trong dieu khien so cot trong moi dong
for (int j = 0; j < cols; ++j) {
cout << "* "; // In mot dau sao va khoang cach
}
cout << endl; // Xuong dong sau khi het mot dong
}
return 0;
}
Giải thích:
- Vòng lặp ngoài với biến
i
chạy từ 0 đếnrows - 1
(tức là 4 lần, tương ứng với 4 dòng). - Với mỗi lần chạy của vòng lặp ngoài (mỗi dòng), vòng lặp bên trong với biến
j
sẽ chạy toàn bộ từ 0 đếncols - 1
(tức là 7 lần, tương ứng với 7 cột). - Bên trong vòng lặp
j
, chúng ta in ra ký tự*
(dấu sao và một khoảng trắng). - Sau khi vòng lặp bên trong (
j
) hoàn thành (kết thúc một dòng), lệnhcout << endl;
sẽ được thực thi để xuống dòng, chuẩn bị in dòng tiếp theo.
Kết quả chạy chương trình sẽ là một hình chữ nhật 4 dòng, 7 cột các dấu sao:
Hinh chu nhat kich thuoc 4x7:
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
Đây là một ví dụ tuyệt vời cho thấy cách các vòng lặp lồng nhau làm việc cùng nhau để tạo ra các cấu trúc phức tạp hơn.
Một vài Lưu Ý Quan Trọng về Vòng lặp for
- Phạm vi biến: Các biến được khai báo trực tiếp trong phần
khởi tạo
củafor
(nhưint i = 0;
) chỉ tồn tại trong phạm vi của vòng lặp đó. Sau khi vòng lặp kết thúc, bạn không thể truy cập biếni
nữa. - Có thể bỏ trống các phần: Bạn có thể bỏ trống một hoặc nhiều phần trong cấu trúc
for
(ví dụ:for ( ; condition ; update )
). Tuy nhiên, bạn phải giữ lại dấu chấm phẩy phân cách. Nếu bạn bỏ trống cả ba phần (for ( ; ; )
), bạn sẽ tạo ra một vòng lặp vô hạn, trừ khi bạn có lệnhbreak
bên trong để thoát. Cẩn thận khi sử dụng vòng lặp vô hạn! - Lệnh
break
vàcontinue
: Tương tự như các loại vòng lặp khác, bạn có thể sử dụngbreak
để thoát khỏi vòng lặpfor
ngay lập tức hoặccontinue
để bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp tiếp theo.
Comments