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_kientrue, 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 xem count có lớn hơn hoặc bằng 1 không.
  • Lần đầu tiên, count10, điều kiện 10 >= 1true, nên khối mã bên trong vòng lặp được thực thi.
  • cout << count << " "; in ra 10.
  • count--; giảm count xuống còn 9.
  • 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 ra 9, 8, 7, ..., 2, 1.
  • Khi count giảm xuống còn 0, điều kiện 0 >= 1 trở thành false. 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ào i còn nhỏ hơn hoặc bằng N.
  • Trong mỗi lần lặp:
    • sum = sum + i; cộng giá trị hiện tại của i vào biến sum.
    • i++; tăng i lên 1. Điều này rất quan trọng để i dần tiến tới N và cuối cùng vượt qua N, làm cho điều kiện i <= N trở thành false để vòng lặp kết thúc.
  • Khi i lớn hơn N, vòng lặp dừng. Biến sum 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ủa while.
  • Vòng lặp while (number != 0) kiểm tra xem số vừa nhập có khác 0 không. Nếu khác 0, đ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ào total.
    • cin >> number; đọc số tiếp theo. Đây là bước quan trọng nhất: nó cập nhật giá trị của number mà điều kiện while sẽ kiểm tra ở lần lặp kế tiếp.
  • Nếu người dùng nhập 0, điều kiện number != 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ện number != 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ị trong positiveNumber còn nhỏ hơn hoặc bằng 0 (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ện positiveNumber <= 0 trở thành false, 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ặp while (tempNumber > 0) sẽ không chạy nếu số ban đầu là 0, dẫn đến count 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ủa number.
  • Vòng lặp while (tempNumber > 0) chạy chừng nào tempNumber 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ành 0, điều kiện tempNumber > 0false, 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

There are no comments at the moment.