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

Bài 7.2: Bài tập thực hành vòng lặp while trong C++
Chào mừng các bạn quay trở lại với series blog về C++ của FullhouseDev! Sau khi đã tìm hiểu về lý thuyết và cú pháp cơ bản của vòng lặp while
ở bài trước, hôm nay chúng ta sẽ cùng nhau xắn tay áo lên và thực hành ngay với một loạt các bài tập minh họa.
Thực hành là cách tốt nhất để nắm vững kiến thức, đặc biệt là với các cấu trúc điều khiển luồng như vòng lặp. Vòng lặp while
cực kỳ linh hoạt, cho phép chúng ta lặp lại một khối mã chừng nào một điều kiện còn đúng. Chúng ta thường sử dụng while
khi _không biết trước_ số lần lặp sẽ là bao nhiêu, hoặc khi điều kiện dừng phụ thuộc vào một sự kiện xảy ra trong quá trình lặp (ví dụ: người dùng nhập một giá trị đặc biệt).
Hãy cùng bắt đầu làm các bài tập để củng cố hiểu biết về while
nhé!
Nhắc lại Vòng lặp while
Trước khi đi vào các bài tập, hãy cùng nhắc lại _cú pháp_ và _cơ chế hoạt động_ của vòng lặp while
:
while (dieu_kien) {
// Khối mã sẽ thực thi chừng nào dieu_kien đúng.
// Cần thay đổi dieu_kien bên trong để tránh lặp vô tận.
}
Vòng lặp sẽ _kiểm tra dieu_kien
_ trước mỗi lần thực thi khối mã. Nếu dieu_kien
là true
, khối mã sẽ chạy. Sau khi chạy xong, dieu_kien
lại được kiểm tra. Quá trình này tiếp diễn cho đến khi dieu_kien
trở thành false
.
Bài tập thực hành 1: Đếm ngược đơn giản
Yêu cầu: Sử dụng vòng lặp while
để in ra các số nguyên từ 10 xuống 1.
Phân tích: Chúng ta cần một biến đếm khởi tạo từ 10. Vòng lặp sẽ tiếp tục chừng nào biến đếm còn lớn hơn hoặc bằng 1. Bên trong vòng lặp, ta in giá trị biến đếm và giảm nó đi 1 sau mỗi lần lặp.
Code minh họa:
#include <iostream>
int main() {
int i = 10;
cout << "Bat dau dem nguoc:" << endl;
while (i >= 1) {
cout << i << " ";
i--;
}
cout << endl;
cout << "Ket thuc!" << endl;
return 0;
}
Output:
Bat dau dem nguoc:
10 9 8 7 6 5 4 3 2 1
Ket thuc!
Giải thích:
- Chúng ta khởi tạo biến
count
với giá trị10
. - Vòng lặp
while (count >= 1)
sẽ kiểm tra xemcount
có lớn hơn hoặc bằng1
không. - Lần đầu tiên,
count
là10
, điều kiện10 >= 1
làtrue
, nên khối mã bên trong vòng lặp được thực thi. cout << count << " ";
in ra10
.count--;
giảmcount
xuống còn9
.- Vòng lặp quay lại kiểm tra điều kiện với
count
mới (9
).9 >= 1
vẫn làtrue
. Quá trình này lặp lại, in ra9, 8, 7, ..., 2, 1
. - Khi
count
giảm xuống còn0
, điều kiện0 >= 1
trở thànhfalse
. Vòng lặp dừng lại. - Chương trình tiếp tục thực thi các lệnh sau vòng lặp.
Bài tập thực hành 2: Tính tổng các số từ 1 đến N
Yêu cầu: Nhập vào một số nguyên dương N từ người dùng, sau đó tính tổng các số nguyên từ 1 đến N bằng vòng lặp while
.
Phân tích: Chúng ta cần đọc N từ người dùng. Cần một biến để duyệt từ 1 đến N (hoặc N xuống 1). Cần một biến khác để lưu tổng. Vòng lặp sẽ chạy chừng nào biến duyệt chưa đạt đến giới hạn.
Code minh họa:
#include <iostream>
int main() {
int n;
int tong = 0;
int i = 1;
cout << "Nhap mot so nguyen duong N: ";
cin >> n;
if (n < 1) {
cout << "N phai la so nguyen duong." << endl;
return 1;
}
while (i <= n) {
tong += i;
i++;
}
cout << "Tong cac so tu 1 den " << n << " la: " << tong << endl;
return 0;
}
Output (ví dụ với N = 5):
Nhap mot so nguyen duong N: 5
Tong cac so tu 1 den 5 la: 15
Output (ví dụ với N = -2):
Nhap mot so nguyen duong N: -2
N phai la so nguyen duong.
Giải thích:
- Chúng ta nhập giá trị
N
từ người dùng. - Khởi tạo
sum = 0
để lưu kết quả tổng vài = 1
để bắt đầu duyệt từ số 1. - Vòng lặp
while (i <= N)
sẽ chạy chừng nàoi
còn nhỏ hơn hoặc bằngN
. - Trong mỗi lần lặp:
sum = sum + i;
cộng giá trị hiện tại củai
vào biếnsum
.i++;
tăngi
lên 1. Điều này rất quan trọng đểi
dần tiến tớiN
và cuối cùng vượt quaN
, làm cho điều kiệni <= N
trở thànhfalse
để vòng lặp kết thúc.
- Khi
i
lớn hơnN
, vòng lặp dừng. Biếnsum
lúc này chứa tổng của các số từ 1 đến N.
Bài tập thực hành 3: Nhập dữ liệu cho đến khi gặp giá trị đặc biệt
Yêu cầu: Viết chương trình cho phép người dùng nhập các số nguyên và tính tổng của chúng. Chương trình sẽ dừng lại khi người dùng nhập số 0
.
Phân tích: Ở đây, số lần lặp _không biết trước_ mà phụ thuộc vào hành động của người dùng. Vòng lặp while
rất phù hợp cho trường hợp này. Điều kiện lặp sẽ là "số vừa nhập khác 0". Ta cần đọc số đầu tiên _trước_ vòng lặp để kiểm tra điều kiện cho lần lặp đầu tiên, và đọc các số tiếp theo _bên trong_ vòng lặp.
Code minh họa:
#include <iostream>
int main() {
int so;
int tong = 0;
cout << "Nhap cac so nguyen (nhap 0 de ket thuc):" << endl;
cin >> so;
while (so != 0) {
tong += so;
cin >> so;
}
cout << "Tong cua cac so da nhap la: " << tong << endl;
return 0;
}
Output (ví dụ):
Nhap cac so nguyen (nhap 0 de ket thuc):
10
5
-3
0
Tong cua cac so da nhap la: 12
Output (ví dụ nhập 0 ngay lập tức):
Nhap cac so nguyen (nhap 0 de ket thuc):
0
Tong cua cac so da nhap la: 0
Giải thích:
- Chúng ta khởi tạo
total = 0
. - Dòng
cin >> number;
trước vòng lặp đọc số đầu tiên do người dùng nhập. Đây là giá trị sẽ được kiểm tra lần đầu tiên trong điều kiện củawhile
. - Vòng lặp
while (number != 0)
kiểm tra xem số vừa nhập có khác0
không. Nếu khác0
, điều kiện làtrue
, khối mã chạy. - Trong khối mã:
total = total + number;
cộng số vừa nhập vàototal
.cin >> number;
đọc số tiếp theo. Đây là bước quan trọng nhất: nó cập nhật giá trị củanumber
mà điều kiệnwhile
sẽ kiểm tra ở lần lặp kế tiếp.
- Nếu người dùng nhập
0
, điều kiệnnumber != 0
sẽ làfalse
, và vòng lặp kết thúc. - Nếu người dùng nhập
0
ngay từ đầu, điều kiệnnumber != 0
sẽ làfalse
ngay lập tức, vòng lặp sẽ không bao giờ chạy, và chương trình in ra tổng là0
.
Bài tập thực hành 4: Xác thực đầu vào đơn giản
Yêu cầu: Yêu cầu người dùng nhập một số nguyên dương. Nếu họ nhập số âm hoặc 0, hãy thông báo lỗi và yêu cầu nhập lại cho đến khi nhận được một số dương hợp lệ.
Phân tích: Tương tự bài 3, số lần nhập không biết trước. Vòng lặp sẽ tiếp tục chừng nào input còn không hợp lệ.
Code minh họa:
#include <iostream>
int main() {
int so;
cout << "Nhap mot so nguyen duong: ";
cin >> so;
while (so <= 0) {
cout << "Loi: So ban nhap khong phai so nguyen duong." << endl;
cout << "Vui long nhap lai mot so nguyen duong: ";
cin >> so;
}
cout << "Ban da nhap so nguyen duong hop le: " << so << endl;
return 0;
}
Output (ví dụ):
Nhap mot so nguyen duong: -5
Loi: So ban nhap khong phai so nguyen duong.
Vui long nhap lai mot so nguyen duong: 0
Loi: So ban nhap khong phai so nguyen duong.
Vui long nhap lai mot so nguyen duong: 123
Ban da nhap so nguyen duong hop le: 123
Giải thích:
- Chúng ta đọc giá trị đầu tiên vào biến
positiveNumber
. - Vòng lặp
while (positiveNumber <= 0)
sẽ chạy chừng nào giá trị trongpositiveNumber
còn nhỏ hơn hoặc bằng0
(tức là không phải số dương). - Nếu điều kiện là
true
(người dùng nhập số không hợp lệ):- Thông báo lỗi.
- Yêu cầu nhập lại và đọc giá trị mới vào
positiveNumber
.
- Quá trình này lặp lại cho đến khi người dùng nhập một số lớn hơn
0
. Lúc này, điều kiệnpositiveNumber <= 0
trở thànhfalse
, và vòng lặp kết thúc. - Chương trình tiếp tục in ra thông báo xác nhận số hợp lệ.
Bài tập thực hành 5: Tìm số lượng chữ số của một số nguyên dương
Yêu cầu: Nhập một số nguyên dương từ người dùng và đếm xem số đó có bao nhiêu chữ số.
Phân tích: Ta có thể đếm số chữ số bằng cách liên tục chia số đó cho 10 và đếm số lần chia cho đến khi số đó bằng 0. Mỗi lần chia cho 10 (lấy phần nguyên) là ta đã loại bỏ một chữ số ở cuối.
Code minh họa:
#include <iostream>
int main() {
int so;
int dem = 0;
cout << "Nhap mot so nguyen duong: ";
cin >> so;
if (so == 0) {
dem = 1;
} else {
int tmp = so;
while (tmp > 0) {
tmp /= 10;
dem++;
}
}
cout << "So " << so << " co " << dem << " chu so." << endl;
return 0;
}
Output (ví dụ với số 12345):
Nhap mot so nguyen duong: 12345
So 12345 co 5 chu so.
Output (ví dụ với số 0):
Nhap mot so nguyen duong: 0
So 0 co 1 chu so.
Output (ví dụ với số 7):
Nhap mot so nguyen duong: 7
So 7 co 1 chu so.
Giải thích:
- Chúng ta đọc số nguyên dương
number
. - Xử lý riêng trường hợp
number == 0
vì vòng lặpwhile (tempNumber > 0)
sẽ không chạy nếu số ban đầu là 0, dẫn đếncount
vẫn là 0. Số 0 có 1 chữ số. - Với các số dương khác 0, chúng ta tạo một bản sao
tempNumber
để thực hiện phép chia mà không làm mất giá trị gốc củanumber
. - Vòng lặp
while (tempNumber > 0)
chạy chừng nàotempNumber
còn lớn hơn 0. - Trong mỗi lần lặp:
tempNumber = tempNumber / 10;
thực hiện phép chia lấy phần nguyên. Ví dụ: 123 / 10 = 12, 12 / 10 = 1, 1 / 10 = 0. Mỗi lần chia là loại bỏ một chữ số.count++;
tăng biến đếm lên 1, ghi nhận đã "xử lý" một chữ số.
- Khi
tempNumber
trở thành0
, điều kiệntempNumber > 0
làfalse
, vòng lặp kết thúc. - Biến
count
lúc này chứa tổng số chữ số của số ban đầu.
Comments