Bài 5.3: Câu lệnh break và continue trong C++

Chào mừng bạn đến với bài viết tiếp theo trong series về C++! Chúng ta đã tìm hiểu về các cấu trúc điều khiển như if-else, switch và các loại vòng lặp như for, while, do-while. Các cấu trúc này cho phép chúng ta thực hiện các khối lệnh một cách có điều kiện hoặc lặp đi lặp lại.

Tuy nhiên, đôi khi trong quá trình thực thi vòng lặp, chúng ta cần một cách linh hoạt hơn để thay đổi luồng chảy của nó. Ví dụ, bạn muốn thoát khỏi vòng lặp ngay lập tức khi tìm thấy một giá trị cụ thể, hoặc bạn muốn bỏ qua một lần lặp hiện tại dựa trên một điều kiện nào đó. Đây chính là lúc breakcontinue phát huy sức mạnh của mình.

Hai câu lệnh này là những công cụ nhỏ gọn nhưng cực kỳ mạnh mẽ để kiểm soát vòng lặp. Hãy cùng đi sâu vào cách chúng hoạt động nhé!

Câu Lệnh break

Câu lệnh break được sử dụng để thoát khỏi cấu trúc lặp (for, while, do-while) hoặc câu lệnh switch gần nhất chứa nó. Khi break được thực thi, luồng chương trình sẽ nhảy ra ngoài cấu trúc đó và tiếp tục thực hiện lệnh ngay sau cấu trúc vừa thoát.

Nghĩ đơn giản, break giống như nút "Thoát Khẩn Cấp" của vòng lặp hoặc switch. Nó làm cho vòng lặp/switch kết thúc ngay lập tức, bất kể điều kiện lặp vẫn còn đúng hay chưa hết các case trong switch.

Ứng Dụng của break:
  • Thoát vòng lặp khi tìm thấy phần tử mong muốn.
  • Thoát vòng lặp vô hạn (while(true)) dựa trên một điều kiện bên trong.
  • Ngăn chặn "fall-through" trong các case của câu lệnh switch (thường là mục đích chính khi dùng break trong switch).
Ví Dụ với break:

Hãy xem một vài ví dụ để hiểu rõ hơn:

Ví Dụ 1: Sử dụng break trong vòng lặp for để tìm kiếm

Giả sử bạn có một danh sách các số và muốn tìm xem một số cụ thể có tồn tại trong danh sách đó không. Ngay khi tìm thấy, bạn không cần duyệt tiếp nữa, hãy thoát khỏi vòng lặp.

#include <iostream> // Cần cho cout, endl, cin
#include <vector>   // Cần cho vector

int main() {
    vector<int> numbers = {10, 5, 20, 15, 30, 25};
    int target = 15;
    bool found = false;
    int found_at_index = -1;

    cout << "**Đang tìm kiếm số " << target << " trong danh sách...**" << endl;

    for (int i = 0; i < numbers.size(); ++i) {
        cout << "-> Đang kiểm tra phần tử thứ " << i << " (giá trị: " << numbers[i] << ")" << endl;
        if (numbers[i] == target) {
            cout << "**!!! Đã tìm thấy mục tiêu " << target << " !!!**" << endl;
            found = true;
            found_at_index = i;
            break; // <-- Thoát khỏi vòng lặp for ngay lập tức
        }
    }

    if (found) {
        cout << "Mục tiêu " << target << " được tìm thấy tại chỉ mục: " << found_at_index << endl;
    } else {
        cout << "Mục tiêu " << target << " không có trong danh sách." << endl;
    }

    return 0;
}

Giải thích:

Trong ví dụ này, vòng lặp for sẽ duyệt qua từng phần tử của vector numbers. Khi if (numbers[i] == target) trở thành true (lúc i bằng 3, numbers[3] là 15), chúng ta in ra thông báo tìm thấy và sau đó gọi break;. Câu lệnh break này sẽ khiến vòng lặp for ngừng hoạt động ngay lập tức. Các lần lặp tiếp theo (với i = 4, i = 5) sẽ không bao giờ được thực hiện. Chương trình sẽ tiếp tục chạy từ dòng code ngay sau dấu đóng ngoặc nhọn } của vòng lặp for.

Ví Dụ 2: Sử dụng break để thoát vòng lặp while vô hạn

Đôi khi, bạn có thể sử dụng vòng lặp while(true) để tạo một vòng lặp chạy mãi mãi và sử dụng break để thoát khỏi nó khi một điều kiện cụ thể được đáp ứng.

#include <iostream>
#include <string> // Cần cho string, getline

int main() {
    string userInput;

    cout << "**Nhập các dòng văn bản (nhập 'thoat' để kết thúc):**" << endl;

    while (true) { // Vòng lặp vô hạn
        cout << "> ";
        getline(cin, userInput); // Đọc cả dòng

        if (userInput == "thoat") {
            cout << "Đang thoát khỏi chương trình nhập liệu..." << endl;
            break; // <-- Thoát khỏi vòng lặp while ngay lập tức
        }

        cout << "*Bạn vừa nhập:* " << userInput << endl;
    }

    cout << "**Chương trình đã kết thúc.**" << endl;

    return 0;
}

Giải thích:

Vòng lặp while(true) sẽ chạy mãi mãi nếu không có gì can thiệp. Chúng ta sử dụng getline để đọc toàn bộ dòng nhập từ người dùng. Bên trong vòng lặp, chúng ta kiểm tra xem userInput có bằng "thoat" hay không. Nếu có, break được gọi, và vòng lặp while dừng lại. Luồng chương trình tiếp tục thực thi lệnh cout << "**Chương trình đã kết thúc.**". Nếu người dùng nhập bất kỳ thứ gì khác ngoài "thoat", break sẽ không được gọi, và vòng lặp sẽ tiếp tục với lần lặp kế tiếp.

Ví Dụ 3: Sử dụng break trong câu lệnh switch

Như đã nói ở trên, breakthiết yếu trong hầu hết các case của switch để ngăn chặn hiện tượng "fall-through".

#include <iostream>

int main() {
    char choice;

    cout << "**Nhập lựa chọn của bạn (a, b, c):** ";
    cin >> choice;

    switch (choice) {
        case 'a':
            cout << "*Bạn đã chọn A.*" << endl;
            break; // <-- Thoát khỏi switch sau khi xử lý case 'a'
        case 'b':
            cout << "*Bạn đã chọn B.*" << endl;
            // Nếu không có break ở đây, nó sẽ "fall through" sang case 'c'
            break; // <-- Thoát khỏi switch sau khi xử lý case 'b'
        case 'c':
            cout << "*Bạn đã chọn C.*" << endl;
            break; // <-- Thoát khỏi switch sau khi xử lý case 'c'
        default:
            cout << "*Lựa chọn không hợp lệ.*" << endl;
            // Không cần break ở default vì nó là case cuối cùng
    }

    cout << "**Tiếp tục thực hiện sau khối switch.**" << endl;

    return 0;
}

Giải thích:

Trong switch, khi một case khớp, code bên trong case đó sẽ được thực thi. Nếu không có break ở cuối case, chương trình sẽ tiếp tục thực thi code ở case tiếp theo (và cứ thế) cho đến khi gặp break hoặc kết thúc khối switch. Việc sử dụng break ở cuối mỗi case (trừ khi bạn muốn fall-through, điều này khá hiếm) là cách chuẩn để đảm bảo chỉ khối lệnh của case khớp được thực thi.

Câu Lệnh continue

Câu lệnh continue được sử dụng để bỏ qua phần còn lại của lần lặp hiện tại của vòng lặp (for, while, do-while) và chuyển ngay lập tức sang lần lặp tiếp theo.

Nghĩ đơn giản, continue giống như nút "Bỏ qua lần này" của vòng lặp. Nó không làm dừng toàn bộ vòng lặp như break, mà chỉ dừng lần lặp đang diễn ra và tiếp tục với lần lặp kế tiếp (kiểm tra điều kiện vòng lặp đối với while/do-while hoặc cập nhật biến đếm và kiểm tra điều kiện đối với for).

Ứng Dụng của continue:
  • Bỏ qua xử lý các phần tử không thỏa mãn điều kiện trong vòng lặp.
  • Chuyển ngay sang lần lặp tiếp theo khi gặp lỗi hoặc dữ liệu không hợp lệ.
Ví Dụ với continue:

Hãy xem cách continue hoạt động khác với break:

Ví Dụ 1: Sử dụng continue trong vòng lặp for để bỏ qua các số chẵn

Bạn muốn in ra chỉ các số lẻ trong một phạm vi.

#include <iostream>

int main() {
    cout << "**Đang in ra các số lẻ từ 1 đến 10:**" << endl;

    for (int i = 1; i <= 10; ++i) {
        if (i % 2 == 0) { // Nếu số i là số chẵn
            cout << "*Bỏ qua số chẵn: " << i << "*" << endl;
            continue; // <-- Bỏ qua phần còn lại của lần lặp này, chuyển sang i++ và kiểm tra điều kiện
        }
        // Nếu đến được đây, tức là i là số lẻ
        cout << "Số lẻ: " << i << endl;
    }

    cout << "**Kết thúc vòng lặp.**" << endl;

    return 0;
}

Giải thích:

Trong vòng lặp for, khi i là một số chẵn (i % 2 == 0), câu lệnh continue; được thực thi. Điều này khiến chương trình bỏ qua dòng cout << "Số lẻ: " << i << endl; cho lần lặp hiện tại đó. Luồng chương trình sẽ ngay lập tức nhảy đến phần cập nhật của vòng lặp for (tức là ++i) và sau đó kiểm tra điều kiện lặp (i <= 10) cho lần lặp kế tiếp. Vòng lặp vẫn chạy đủ 10 lần, nhưng code in số lẻ chỉ chạy khi i là số lẻ.

Ví Dụ 2: Sử dụng continue trong vòng lặp while để bỏ qua dữ liệu không hợp lệ

Giả sử bạn đang đọc các số từ người dùng và chỉ muốn xử lý các số dương, bỏ qua các số 0 hoặc số âm mà không kết thúc chương trình ngay.

#include <iostream>

int main() {
    int num;
    int sumOfPositives = 0;

    cout << "**Nhập các số (nhập 0 để kết thúc):**" << endl;

    while (true) { // Vòng lặp vô hạn
        cout << "Nhập một số: ";
        cin >> num;

        if (num == 0) { // Điều kiện thoát
            break; // <-- Thoát vòng lặp khi nhập 0
        }

        if (num < 0) { // Nếu số là âm
            cout << "*Bỏ qua số âm: " << num << "*" << endl;
            continue; // <-- Bỏ qua phần còn lại của lần lặp này, quay lại kiểm tra điều kiện while (vẫn là true) và nhập số mới
        }

        // Nếu đến được đây, tức là số là dương (num > 0)
        sumOfPositives += num;
        cout << "Đã cộng số dương: " << num << ". Tổng hiện tại: " << sumOfPositives << endl;
    }

    cout << "**Kết thúc nhập liệu. Tổng các số dương đã nhập là: " << sumOfPositives << "**" << endl;

    return 0;
}

Giải thích:

Vòng lặp while(true) chạy liên tục. Chúng ta sử dụng break để thoát khi người dùng nhập 0. Tuy nhiên, nếu người dùng nhập một số âm (num < 0), chúng ta chỉ muốn bỏ qua việc xử lý số đó trong lần lặp hiện tại và yêu cầu nhập số tiếp theo. continue; làm điều này. Nó nhảy ngay lên đầu vòng lặp while (kiểm tra điều kiện, sau đó thực thi lại thân vòng lặp), bỏ qua dòng tính tổng sumOfPositives += num; cho số âm đó.

Tổng Kết Sự Khác Biệt

Hãy nhớ điểm khác biệt quan trọng nhất giữa breakcontinue:

  • break: Thoát hoàn toàn khỏi vòng lặp hoặc câu lệnh switch chứa nó. Luồng thực thi tiếp tục sau khối lệnh đó.
  • continue: Bỏ qua phần còn lại của lần lặp hiện tại của vòng lặp. Luồng thực thi nhảy đến đầu lần lặp tiếp theo (kiểm tra điều kiện/cập nhật biến đếm).

Hiểu và sử dụng đúng breakcontinue sẽ giúp code của bạn linh hoạt, hiệu quảdễ đọc hơn trong nhiều trường hợp xử lý vòng lặp. Chúng là những công cụ đắc lực trong hộp công cụ của một lập trình viên C++!

Comments

There are no comments at the moment.