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

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 break
và continue
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ùngbreak
trongswitch
).
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, break
là thiế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 break
và continue
:
break
: Thoát hoàn toàn khỏi vòng lặp hoặc câu lệnhswitch
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 break
và continue
sẽ giúp code của bạn linh hoạt, hiệu quả và 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