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

Chào mừng các bạn đến với một bài viết mới trong series blog về C++ của FullhouseDev! Sau khi đã làm quen với vòng lặp whilefor - những công cụ mạnh mẽ giúp tự động hóa các tác vụ lặp đi lặp lại, hôm nay chúng ta sẽ khám phá một "người anh em" khác cũng cực kỳ hữu ích: vòng lặp do-while.

Nếu whilefor kiểm tra điều kiện trước khi thực thi thân vòng lặp, thì do-while có một đặc điểm độc đáo: nó luôn thực thi thân vòng lặp ít nhất một lần trước khi kiểm tra điều kiện lặp. Điều này tạo ra những tình huống sử dụng đặc thù mà các vòng lặp khác không linh hoạt bằng.

Hãy cùng đi sâu vào cú pháp, cách hoạt động và những ứng dụng thú vị của do-while nhé!

Cú pháp của vòng lặp do-while

Cú pháp của do-while khá đơn giản và dễ nhớ:

do {
    // Các câu lệnh sẽ được thực thi
    // ít nhất một lần
} while (điều_kiện); // Điều kiện kiểm tra sau khi thực thi khối lệnh
  • Từ khóa do đánh dấu điểm bắt đầu của vòng lặp.
  • Khối mã bên trong cặp ngoặc nhọn {} chính là thân (body) của vòng lặp. Các câu lệnh trong đây sẽ được thực thi mỗi lần lặp.
  • Từ khóa while theo sau khối lệnh, kèm theo điều_kiện trong cặp ngoặc đơn (). Điều kiện này là một biểu thức logic, trả về true hoặc false.
  • ĐẶC BIỆT quan trọng: Hãy chú ý đến dấu chấm phẩy ; ở cuối câu lệnh while (điều_kiện);. Đây là điều khác biệt so với vòng lặp while thông thường!

Vòng lặp do-while hoạt động như thế nào?

Quy trình hoạt động của do-while rất rõ ràng:

  1. Chương trình thực thi tất cả các câu lệnh bên trong khối {} (thân vòng lặp).
  2. Sau khi thực thi xong khối lệnh lần đầu tiên, chương trình sẽ kiểm tra điều_kiện trong câu lệnh while().
  3. Nếu điều_kiệntrue, chương trình quay trở lại bước 1 và tiếp tục thực thi lại khối lệnh.
  4. Quá trình này lặp đi lặp lại cho đến khi điều_kiện trở thành false.
  5. Khi điều_kiệnfalse, vòng lặp kết thúc, và chương trình tiếp tục thực thi các câu lệnh ngay sau dấu ; của while().

Điểm mấu chốt cần ghi nhớ: Thân vòng lặp do-while luôn được thực thi ít nhất một lần, bất kể điều kiện ban đầu là đúng hay sai.

Khi nào nên sử dụng do-while?

Như đã nói, do-while tỏa sáng trong các tình huống mà bạn chắc chắn cần thực hiện một hành động ít nhất một lần trước khi quyết định có lặp lại hay không. Tình huống phổ biến nhất chính là:

  • Nhập liệu từ người dùng và xác thực (validation): Bạn cần yêu cầu người dùng nhập dữ liệu (hành động 1 lần). Sau đó, bạn kiểm tra xem dữ liệu đó có hợp lệ không. Nếu không hợp lệ, bạn cần yêu cầu họ nhập lại (lặp lại hành động). Vòng lặp do-while rất phù hợp cho việc này vì bạn luôn cần nhập liệu lần đầu.

Hãy cùng xem một vài ví dụ minh họa để thấy rõ sức mạnh và tính ứng dụng của do-while.

Các ví dụ minh họa vòng lặp do-while trong C++

Ví dụ 1: Chắc chắn chạy ít nhất một lần

Hãy xem ví dụ này để thấy rằng do-while sẽ chạy dù điều kiện ban đầu đã sai.

#include <iostream>

int main() {
    using namespace std;

    int dem = 0;

    cout << "Bat dau vong lap do-while..." << endl;

    do {
        cout << "Day la lan chay thu: " << (dem + 1) << endl;
        dem++;
    } while (dem < 0);

    cout << "Vong lap ket thuc. Tong so lan chay: " << dem << endl;

    return 0;
}

Output:

Bat dau vong lap do-while...
Day la lan chay thu: 1
Vong lap ket thuc. Tong so lan chay: 1
Ví dụ 2: Nhập số dương từ người dùng

Đây là một ứng dụng kinh điển của do-while: đảm bảo người dùng nhập vào một giá trị hợp lệ.

#include <iostream>

int main() {
    using namespace std;

    int n;

    do {
        cout << "Vui long nhap mot so nguyen DUONG: ";
        cin >> n;

        if (n <= 0) {
            cout << "So ban vua nhap khong phai so duong. Hay nhap lai!" << endl;
        }

    } while (n <= 0);

    cout << "Ban da nhap thanh cong so nguyen duong: " << n << endl;

    return 0;
}

Output (ví dụ với nhập -5, rồi 0, rồi 10):

Vui long nhap mot so nguyen DUONG: -5
So ban vua nhap khong phai so duong. Hay nhap lai!
Vui long nhap mot so nguyen DUONG: 0
So ban vua nhap khong phai so duong. Hay nhap lai!
Vui long nhap mot so nguyen DUONG: 10
Ban da nhap thanh cong so nguyen duong: 10
Ví dụ 3: Xây dựng menu đơn giản

do-while rất phù hợp để tạo ra một menu tương tác, nơi chương trình hiển thị các tùy chọn và lặp lại cho đến khi người dùng chọn tùy chọn thoát.

#include <iostream>

int main() {
    using namespace std;

    char chon;

    do {
        cout << "\n--- MENU DON GIAN ---" << endl;
        cout << "1. Chuc nang A" << endl;
        cout << "2. Chuc nang B" << endl;
        cout << "3. Thoat" << endl;
        cout << "Moi ban chon (1, 2 hoac 3): ";
        cin >> chon;

        switch (chon) {
            case '1':
                cout << "Ban da chon Chuc nang A." << endl;
                break;
            case '2':
                cout << "Ban da chon Chuc nang B." << endl;
                break;
            case '3':
                cout << "Dang thoat chuong trinh..." << endl;
                break;
            default:
                cout << "Lua chon khong hop le. Vui long chon lai." << endl;
                break;
        }

    } while (chon != '3');

    cout << "Chuong trinh da ket thuc." << endl;

    return 0;
}

Output (ví dụ với nhập 'a', rồi '1', rồi '3'):

--- MENU DON GIAN ---
1. Chuc nang A
2. Chuc nang B
3. Thoat
Moi ban chon (1, 2 hoac 3): a
Lua chon khong hop le. Vui long chon lai.

--- MENU DON GIAN ---
1. Chuc nang A
2. Chuc nang B
3. Thoat
Moi ban chon (1, 2 hoac 3): 1
Ban da chon Chuc nang A.

--- MENU DON GIAN ---
1. Chuc nang A
2. Chuc nang B
3. Thoat
Moi ban chon (1, 2 hoac 3): 3
Dang thoat chuong trinh...
Chuong trinh da ket thuc.
Ví dụ 4: Tính tổng các số nhập vào cho đến khi gặp giá trị dừng

Một ví dụ khác cho thấy sự hữu ích khi bạn cần xử lý giá trị nhập vào ngay lập tức trước khi quyết định có dừng lại dựa trên chính giá trị đó hay không.

#include <iostream>

int main() {
    using namespace std;

    int n;
    int s = 0;

    cout << "Nhap cac so nguyen de tinh tong. Nhap 0 de dung lai." << endl;

    do {
        cout << "Nhap mot so: ";
        cin >> n;
        s += n;

    } while (n != 0);

    cout << "Tong cac so da nhap (bao gom ca so 0 cuoi cung) la: " << s << endl;

    return 0;
}

Output (ví dụ với nhập 5, rồi 10, rồi -2, rồi 0):

Nhap cac so nguyen de tinh tong. Nhap 0 de dung lai.
Nhap mot so: 5
Nhap mot so: 10
Nhap mot so: -2
Nhap mot so: 0
Tong cac so da nhap (bao gom ca so 0 cuoi cung) la: 13
Ví dụ 5: Lặp lại một số lần nhất định (Dù for hay while thường dùng hơn)

Mặc dù for hoặc while thường được ưu tiên khi bạn biết trước số lần lặp, bạn vẫn có thể sử dụng do-while cho mục đích này để hiểu rõ hơn cách nó hoạt động.

#include <iostream>

int main() {
    using namespace std;

    int i = 0;
    int n = 5;

    cout << "Bat dau vong lap do-while de chay 5 lan..." << endl;

    do {
        cout << "Lan lap thu: " << (i + 1) << endl;
        i++;
    } while (i < n);

    cout << "Da hoan thanh " << i << " lan lap." << endl;

    return 0;
}

Output:

Bat dau vong lap do-while de chay 5 lan...
Lan lap thu: 1
Lan lap thu: 2
Lan lap thu: 3
Lan lap thu: 4
Lan lap thu: 5
Da hoan thanh 5 lan lap.

Lưu ý quan trọng khi sử dụng do-while

  • Đừng quên dấu chấm phẩy ; sau biểu thức while (điều_kiện);. Đây là lỗi cú pháp phổ biến nhất với do-while.
  • Giống như các vòng lặp khác, hãy đảm bảo rằng điều kiện trong while cuối cùng có thể trở thành false. Nếu không, bạn sẽ tạo ra một vòng lặp vô hạn (infinite loop), khiến chương trình chạy mãi không dừng. Hãy chắc chắn có một câu lệnh nào đó bên trong thân vòng lặp làm thay đổi các biến được sử dụng trong điều_kiện sao cho cuối cùng nó dẫn đến kết thúc vòng lặp.

So sánh ngắn gọn với while

Điểm khác biệt cốt lõi và duy nhất giữa do-whilewhile là thời điểm kiểm tra điều kiện:

  • while: Kiểm tra điều kiện trước khi thực thi thân vòng lặp. Thân vòng lặp có thể không bao giờ được thực thi nếu điều kiện ban đầu là false.
  • do-while: Thực thi thân vòng lặp trước, sau đó mới kiểm tra điều kiện. Thân vòng lặp luôn được thực thi ít nhất một lần, ngay cả khi điều kiện ban đầu là false.

Lựa chọn giữa whiledo-while phụ thuộc vào logic cụ thể của bài toán bạn đang giải quyết. Nếu bạn chắc chắn cần thực hiện hành động ít nhất một lần, do-while là lựa chọn rõ ràng và thanh lịch nhất. Trong hầu hết các trường hợp khác, while hoặc for có thể phù hợp hơn.

Comments

There are no comments at the moment.