Vòng lặp trong C++


Bài 6: Vòng lặp trong C++

Trong hầu hết các chương trình thực tế, việc lặp lại một hành động nhiều lần là điều không thể tránh khỏi. Ví dụ, in ra 100 dòng văn bản, duyệt qua toàn bộ phần tử của một mảng, hoặc liên tục yêu cầu người dùng nhập dữ liệu cho đến khi họ nhập đúng. Việc viết lại cùng một đoạn mã hàng chục lần là không khả thi, và cũng không đúng tinh thần của lập trình hiện đại. Đó là lý do C++ cung cấp ba cấu trúc lặp: forwhile, và do while.

Câu lệnh for được thiết kế để sử dụng trong các trường hợp có số lần lặp xác định trước. Cú pháp điển hình gồm ba phần: khởi tạo biến điều khiển, điều kiện lặp, và phép cập nhật sau mỗi vòng lặp. Cả ba phần được viết trong cùng một dòng, tạo nên một cấu trúc rõ ràng và dễ đọc.

for (int i = 0; i < 10; i++) {
    cout << i << endl;
}

Khi đoạn mã trên chạy, biến i được khởi tạo bằng 0, sau đó điều kiện i < 10 được kiểm tra. Nếu điều kiện đúng, thân vòng lặp được thực thi. Sau mỗi lần thực thi, biểu thức i++ được chạy, tức là biến i tăng thêm 1. Quá trình này lặp lại cho đến khi điều kiện sai.

Mặc dù for thường được dùng với biến đếm số nguyên, nhưng nó hoàn toàn có thể sử dụng cho các kiểu dữ liệu khác hoặc điều kiện phức tạp hơn. Thậm chí, ba phần trong biểu thức for có thể để trống:

int i = 0;
for (;;) {
    if (i >= 5) break;
    cout << i << endl;
    i++;
}

Đây là một vòng lặp vô hạn có điều kiện dừng bên trong. Tuy nhiên, cần cẩn trọng khi dùng vì dễ tạo ra lỗi logic khiến chương trình chạy mãi không dừng.

Trường hợp bạn không biết trước số lần lặp, chẳng hạn chờ đến khi người dùng nhập đúng mật khẩu, thì nên dùng vòng lặp while. Với while, điều kiện được đánh giá trước khi thân vòng lặp chạy. Nếu điều kiện sai ngay từ đầu, khối lệnh sẽ không thực thi lần nào.

string pass;
while (pass != "123456") {
    cout << "Nhap mat khau: ";
    cin >> pass;
}
cout << "Dang nhap thanh cong." << endl;

Với cấu trúc này, nếu người dùng nhập đúng mật khẩu ngay từ lần đầu tiên, vòng lặp sẽ không thực hiện thân lặp lần nào.

Ngược lại, có những tình huống cần thực hiện ít nhất một lần, rồi sau đó mới kiểm tra điều kiện. C++ cung cấp vòng do while cho mục đích này. Cấu trúc giống while, nhưng điều kiện được kiểm tra sau thân lặp.

int n;
do {
    cout << "Nhap so nguyen duong: ";
    cin >> n;
} while (n <= 0);

Câu lệnh này đảm bảo rằng người dùng luôn được yêu cầu nhập ít nhất một lần, dù họ có nhập đúng hay không.

Trong cả ba loại vòng lặp, bạn có thể sử dụng break để thoát khỏi vòng lặp ngay lập tức, hoặc continue để bỏ qua phần còn lại của vòng lặp hiện tại và chuyển sang vòng tiếp theo.

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) continue; // bỏ qua số chẵn
    if (i > 7) break;         // dừng khi i > 7
    cout << i << " ";
}

Vòng lặp có thể được lồng nhau để xử lý các cấu trúc lặp phức tạp hơn. Ví dụ, để in ra một bảng nhân:

for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5; j++) {
        cout << i * j << "t";
    }
    cout << endl;
}

Trong đoạn mã trên, vòng ngoài điều khiển dòng, vòng trong điều khiển cột. Đây là kỹ thuật cơ bản khi xử lý mảng hai chiều, ma trận, hoặc biểu diễn lưới trong các thuật toán.

Một dạng đặc biệt là vòng lặp vô hạn, thường dùng trong các chương trình phản ứng liên tục như game, hệ thống điều khiển thiết bị, hoặc menu tương tác:

while (true) {
    int chon;
    cout << "1. Themn2. Xoan3. ThoatnChon: ";
    cin >> chon;
    if (chon == 3) break;
    // xử lý theo lựa chọn
}

Người viết cần có trách nhiệm đảm bảo rằng vòng lặp này luôn có điều kiện để thoát, tránh tình trạng khóa chết chương trình.

Ba loại vòng lặp nói trên là nền tảng để xây dựng các thuật toán cao hơn: duyệt dữ liệu, tìm kiếm, lọc, sắp xếp, thống kê… Việc hiểu rõ cách sử dụng từng loại vòng, khi nào nên chọn for, khi nào nên chọn while, là bước chuyển từ biết lập trình sang biết tư duy thuật toán.