Bài 5.2: Vòng lặp while và do-while trong C++

Chào mừng bạn trở lại với chuỗi bài viết về C++ của FullhouseDev! Hôm nay, chúng ta sẽ đi sâu vào hai công cụ cực kỳ mạnh mẽ và linh hoạt trong lập trình: vòng lặp whilevòng lặp do-while. Chúng là những người bạn đồng hành không thể thiếu khi bạn cần thực hiện một hành động lặp đi lặp lại dựa trên một điều kiện nào đó.

Tại Sao Chúng Ta Cần Vòng Lặp?

Tưởng tượng bạn cần in dòng chữ "Xin chào C++!" 100 lần. Bạn có thể viết lệnh cout << "Xin chào C++!" << endl; 100 lần, nhưng điều đó thật nhàm chán, tốn thời gian và dễ gây lỗi. Hoặc phức tạp hơn, bạn cần đọc dữ liệu từ người dùng cho đến khi họ nhập một giá trị hợp lệ. Bạn không biết trước sẽ cần bao nhiêu lần nhập.

Đây chính là lúc các vòng lặp tỏa sáng! Chúng cho phép chúng ta viết một khối lệnh một lần và chỉ định cho chương trình lặp lại khối lệnh đó nhiều lần, miễn là một điều kiện nào đó còn đúng.

Trong C++, chúng ta có nhiều loại vòng lặp, và while cùng do-while là hai trong số những loại phổ biến và quan trọng nhất.

Vòng Lặp while: Lặp Khi Điều Kiện Còn Đúng

Vòng lặp while là loại vòng lặp cơ bản nhất. Nó kiểm tra điều kiện trước khi thực hiện khối lệnh bên trong. Nếu điều kiện ban đầu đã sai, khối lệnh sẽ không bao giờ được thực thi.

Cú pháp của vòng lặp while như sau:

while (condition) {
    // Khối lệnh sẽ được thực thi
    // miễn là 'condition' còn đúng
}

Ở đây:

  • condition: Là một biểu thức logic (trả về true hoặc false).
  • Khối lệnh bên trong dấu ngoặc nhọn {}: Là đoạn code sẽ được lặp lại.

Nguyên tắc hoạt động:

  1. Kiểm tra condition.
  2. Nếu conditiontrue, thực thi khối lệnh bên trong.
  3. Sau khi thực thi xong khối lệnh, quay lại bước 1.
  4. Nếu conditionfalse, thoát khỏi vòng lặp và tiếp tục thực thi các lệnh sau vòng lặp.
Ví Dụ 1: Đếm Ngược Đơn Giản

Hãy sử dụng vòng lặp while để in ra các số từ 5 đến 1.

#include <iostream>

int main() {
    using namespace std;
    int i = 5;

    while (i >= 1) {
        cout << "Đếm ngược: " << i << endl;
        i--;
    }

    cout << "Bắt đầu!" << endl;

    return 0;
}

Output:

Đếm ngược: 5
Đếm ngược: 4
Đếm ngược: 3
Đếm ngược: 2
Đếm ngược: 1
Bắt đầu!

Giải thích:

  • Chúng ta khởi tạo biến count với giá trị 5.
  • Vòng lặp while kiểm tra điều kiện count >= 1. Lần đầu tiên, 5 >= 1true.
  • Khối lệnh bên trong được thực thi: in giá trị của count (là 5), sau đó giảm count xuống còn 4.
  • Vòng lặp quay lại kiểm tra điều kiện: 4 >= 1 vẫn là true. Lặp lại.
  • Quá trình này tiếp tục cho đến khi count giảm xuống 0.
  • Khi count là 0, điều kiện 0 >= 1false. Vòng lặp kết thúc.
  • Chương trình tiếp tục với lệnh cout << "Bắt đầu!" << endl;.

Lưu ý quan trọng: Bên trong vòng lặp while, bạn phải có một lệnh nào đó làm thay đổi giá trị của biến hoặc biểu thức được sử dụng trong điều kiện. Nếu không, điều kiện sẽ luôn đúng (hoặc luôn sai) và bạn sẽ rơi vào:

  • Vòng lặp vô tận (infinite loop): Nếu điều kiện luôn đúng. Đây là lỗi phổ biến!
  • Vòng lặp không chạy: Nếu điều kiện ban đầu đã sai (đôi khi là ý muốn, đôi khi là lỗi).
Ví Dụ 2: Nhập Dữ Liệu Cho Đến Khi Gặp Giá Trị Đặc Biệt

Giả sử chúng ta muốn người dùng nhập các số nguyên, và dừng lại khi họ nhập số 0.

#include <iostream>

int main() {
    using namespace std;
    int so;

    cout << "Nhập các số nguyên (nhập 0 để thoát):" << endl;
    cin >> so;

    while (so != 0) {
        cout << "Bạn vừa nhập: " << so << endl;
        cout << "Tiếp tục nhập (nhập 0 để thoát):" << endl;
        cin >> so;
    }

    cout << "Kết thúc chương trình." << endl;

    return 0;
}

Output (ví dụ với đầu vào người dùng là 10, 5, 0):

Nhập các số nguyên (nhập 0 để thoát):
10
Bạn vừa nhập: 10
Tiếp tục nhập (nhập 0 để thoát):
5
Bạn vừa nhập: 5
Tiếp tục nhập (nhập 0 để thoát):
0
Kết thúc chương trình.

Giải thích:

  • Chúng ta cần đọc giá trị đầu tiên trước vòng lặp. Điều này là cần thiết để vòng lặp while có một giá trị để kiểm tra trong lần lặp đầu tiên.
  • Điều kiện là number != 0. Vòng lặp sẽ tiếp tục trong khi số nhập vào không phải là 0.
  • Bên trong vòng lặp, chúng ta xử lý số vừa nhập (ở đây chỉ đơn giản là in lại) và quan trọng hơn, chúng ta lại đọc một số mới từ người dùng. Giá trị mới này sẽ được sử dụng để kiểm tra điều kiện trong lần lặp tiếp theo.
  • Khi người dùng nhập 0, điều kiện number != 0 trở thành false, vòng lặp kết thúc.

Vòng lặp while rất phù hợp khi bạn không biết trước số lần lặp cần thiết, và có thể là không cần lặp lần nào cả (nếu điều kiện ban đầu đã sai).

Vòng Lặp do-while: Chắc Chắn Lặp Ít Nhất Một Lần

Vòng lặp do-while tương tự như while, nhưng có một điểm khác biệt quan trọng: nó thực thi khối lệnh trước, sau đó mới kiểm tra điều kiện. Điều này đảm bảo rằng khối lệnh bên trong do-while sẽ luôn được thực thi ít nhất một lần, ngay cả khi điều kiện ngay lập tức là sai.

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

do {
    // Khối lệnh sẽ được thực thi
    // ít nhất một lần, sau đó kiểm tra 'condition'
} while (condition); // Lưu ý dấu chấm phẩy ở cuối!

Ở đây:

  • Khối lệnh bên trong dấu ngoặc nhọn {}: Là đoạn code sẽ được thực thi.
  • condition: Là một biểu thức logic, được kiểm tra sau khi khối lệnh đã chạy xong một lần.
  • Lưu ý: Phải có dấu chấm phẩy ; sau while (condition).

Nguyên tắc hoạt động:

  1. Thực thi khối lệnh bên trong do.
  2. Kiểm tra condition.
  3. Nếu conditiontrue, quay lại bước 1 (thực thi khối lệnh lại).
  4. Nếu conditionfalse, thoát khỏi vòng lặp và tiếp tục thực thi các lệnh sau vòng lặp.
Ví Dụ 3: Chắc Chắn Thực Hiện Ít Nhất Một Lần

Để minh họa việc thực thi ít nhất một lần, chúng ta có thể đặt điều kiện luôn sai.

#include <iostream>

int main() {
    using namespace std;
    do {
        cout << "Dòng này luôn được in ra ít nhất một lần!" << endl;
    } while (false);

    cout << "Vòng lặp do-while đã kết thúc." << endl;

    return 0;
}

Output:

Dòng này luôn được in ra ít nhất một lần!
Vòng lặp do-while đã kết thúc.

Giải thích:

  • Chương trình gặp khối do và thực thi lệnh cout.
  • Sau khi thực thi xong, chương trình kiểm tra điều kiện false.
  • Vì điều kiện là false, vòng lặp kết thúc ngay sau lần thực thi đầu tiên.
Ví Dụ 4: Nhập Dữ Liệu Cho Đến Khi Hợp Lệ (Sử Dụng do-while)

Vòng lặp do-while rất hữu ích cho việc xác thực đầu vào của người dùng. Bạn cần yêu cầu người dùng nhập dữ liệu ít nhất một lần trước khi có thể kiểm tra xem dữ liệu đó có hợp lệ hay không.

#include <iostream>

int main() {
    using namespace std;
    int tuoi;

    do {
        cout << "Hãy nhập tuổi của bạn (phải lớn hơn 0): ";
        cin >> tuoi;
        if (tuoi <= 0) {
            cout << "Tuổi phải là một số dương. Vui lòng thử lại." << endl;
        }
    } while (tuoi <= 0);

    cout << "Tuyệt vời! Tuổi của bạn là: " << tuoi << endl;

    return 0;
}

Output (ví dụ với đầu vào người dùng là -5, 0, 25):

Hãy nhập tuổi của bạn (phải lớn hơn 0): -5
Tuổi phải là một số dương. Vui lòng thử lại.
Hãy nhập tuổi của bạn (phải lớn hơn 0): 0
Tuổi phải là một số dương. Vui lòng thử lại.
Hãy nhập tuổi của bạn (phải lớn hơn 0): 25
Tuyệt vời! Tuổi của bạn là: 25

Giải thích:

  • Khối do được thực thi lần đầu: yêu cầu người dùng nhập tuổi và đọc giá trị vào biến age. Nếu tuổi không hợp lệ, in thông báo lỗi.
  • Sau lần thực thi đầu tiên, điều kiện age <= 0 được kiểm tra.
  • Nếu age nhỏ hơn hoặc bằng 0 (không hợp lệ), điều kiện là true, và vòng lặp sẽ lặp lại (yêu cầu nhập lại).
  • Quá trình này tiếp tục cho đến khi người dùng nhập một số lớn hơn 0.
  • Khi age lớn hơn 0, điều kiện age <= 0 trở thành false, vòng lặp kết thúc.
  • Chương trình in ra tuổi hợp lệ.

So với ví dụ nhập liệu dùng while (Ví dụ 2), ví dụ này dùng do-while trông gọn gàng hơn vì chúng ta không cần phải đọc dữ liệu trước vòng lặp. Lần đọc dữ liệu đầu tiên được đặt gọn gàng bên trong khối do.

while hay do-while: Chọn Lựa Thế Nào?

Việc lựa chọn giữa whiledo-while phụ thuộc vào logic bạn muốn áp dụng:

  • Sử dụng while khi bạn muốn vòng lặp có thể không thực thi lần nào nếu điều kiện ban đầu đã sai. Đây là trường hợp phổ biến hơn. (Lặp 0 hoặc nhiều lần).

    • Ví dụ: Xử lý các phần tử trong một danh sách. Nếu danh sách trống, bạn không cần xử lý phần tử nào cả.
  • Sử dụng do-while khi bạn muốn đảm bảo khối lệnh được thực thi ít nhất một lần, sau đó mới kiểm tra điều kiện để quyết định có lặp tiếp hay không. (Lặp 1 hoặc nhiều lần).

    • Ví dụ: Yêu cầu người dùng nhập mật khẩu và kiểm tra. Bạn phải yêu cầu nhập ít nhất một lần trước khi kiểm tra. Hoặc hiển thị menu lựa chọn và chờ người dùng chọn.

Cả hai loại vòng lặp này đều cực kỳ linh hoạt và có thể sử dụng để giải quyết nhiều vấn đề lặp trong C++. Nắm vững cách hoạt động và sự khác biệt giữa chúng sẽ giúp bạn viết code hiệu quả và chính xác hơn.

Comments

There are no comments at the moment.