Chuyển tới nội dung chính

🛑 Điều Khiển Lặp - Break & Continue

Chào mừng đến với bài học về Break & Continue - cách điều khiển vòng lặp trong quán Café!

🎯 Món Ăn Hôm Nay

Tưởng tượng bạn đang pha cà phê cho khách:

  • Hết nguyên liệu giữa chừng → Dừng hẳn (break)
  • Ly bị lỗi, bỏ qua → Pha ly tiếp theo (continue)
  • Kiểm soát quy trình → Linh hoạt xử lý

Đó chính là Break & Continue - kiểm soát vòng lặp!

🛑 Break & Continue Là Gì?

Break - Dừng Hẳn

break = Đóng cửa quán sớm (thoát khỏi vòng lặp)

for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // Dừng khi i = 5
}
System.out.println("☕ Pha ly thứ " + i);
}
// Output: Chỉ pha được 4 ly (1, 2, 3, 4)

Continue - Bỏ Qua

continue = Bỏ qua ly lỗi, pha ly tiếp theo (bỏ qua lượt lặp hiện tại)

for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // Bỏ qua ly thứ 3
}
System.out.println("☕ Pha ly thứ " + i);
}
// Output: Pha ly 1, 2, 4, 5 (bỏ qua 3)

Ẩn Dụ Café:

  • break = Hết nguyên liệu → Đóng cửa sớm
  • continue = Ly lỗi → Bỏ qua, pha ly mới
  • Vòng lặp = Quy trình pha cà phê liên tục
  • Điều kiện = Kiểm tra chất lượng

👨‍🍳 Câu Chuyện Trong Quán

Một ngày làm việc tại quán:

Tình huống 1: Hết Nguyên Liệu (break)

public class HetNguyenLieu {
public static void main(String[] args) {
int soLuongSua = 3; // Chỉ đủ pha 3 ly

for (int i = 1; i <= 10; i++) {
if (i > soLuongSua) {
System.out.println("❌ Hết sữa! Dừng phục vụ.");
break; // Dừng hẳn
}
System.out.println("☕ Pha Latte ly thứ " + i);
}
}
}

Output:

☕ Pha Latte ly thứ 1
☕ Pha Latte ly thứ 2
☕ Pha Latte ly thứ 3
❌ Hết sữa! Dừng phục vụ.

Tình huống 2: Bỏ Qua Ly Lỗi (continue)

public class BoQuaLyLoi {
public static void main(String[] args) {
for (int soLy = 1; soLy <= 5; soLy++) {
if (soLy == 3) {
System.out.println("⚠️ Ly " + soLy + " bị nứt, bỏ qua!");
continue; // Bỏ qua ly này
}
System.out.println("✅ Pha ly " + soLy + " thành công");
}
}
}

Output:

✅ Pha ly 1 thành công
✅ Pha ly 2 thành công
⚠️ Ly 3 bị nứt, bỏ qua!
✅ Pha ly 4 thành công
✅ Pha ly 5 thành công

📝 Công Thức Nấu (Code Examples)

Ví Dụ 1: Tìm Đồ Uống Đầu Tiên Hết Hàng (break)

public class TimDoUongHetHang {
public static void main(String[] args) {
String[] menu = {"Espresso", "Latte", "Cappuccino", "Mocha", "Americano"};
int[] soLuong = {10, 5, 0, 8, 12};

System.out.println("🔍 Kiểm tra kho:");
for (int i = 0; i < menu.length; i++) {
System.out.println("Đang kiểm tra: " + menu[i]);

if (soLuong[i] == 0) {
System.out.println("❌ " + menu[i] + " đã hết hàng!");
System.out.println("🛑 Cần đặt hàng ngay!");
break; // Tìm thấy món hết, dừng kiểm tra
}

System.out.println("✅ " + menu[i] + ": còn " + soLuong[i] + " ly\n");
}
}
}

Output:

🔍 Kiểm tra kho:
Đang kiểm tra: Espresso
✅ Espresso: còn 10 ly

Đang kiểm tra: Latte
✅ Latte: còn 5 ly

Đang kiểm tra: Cappuccino
❌ Cappuccino đã hết hàng!
🛑 Cần đặt hàng ngay!

Ví Dụ 2: Bỏ Qua Giờ Nghỉ Trưa (continue)

public class GioPhucVu {
public static void main(String[] args) {
System.out.println("📅 LỊCH PHỤC VỤ:\n");

for (int gio = 7; gio <= 22; gio++) {
// Bỏ qua giờ nghỉ trưa (12-14h)
if (gio >= 12 && gio < 14) {
continue; // Không phục vụ
}

System.out.println("☕ " + gio + ":00 - Đang phục vụ");
}

System.out.println("\n⏰ 12:00-14:00: Nghỉ trưa");
}
}

Output:

📅 LỊCH PHỤC VỤ:

☕ 7:00 - Đang phục vụ
☕ 8:00 - Đang phục vụ
...
☕ 11:00 - Đang phục vụ
☕ 14:00 - Đang phục vụ
☕ 15:00 - Đang phục vụ
...
☕ 22:00 - Đang phục vụ

⏰ 12:00-14:00: Nghỉ trưa

Ví Dụ 3: Tìm Mã Giảm Giá Hợp Lệ (break)

public class KiemTraMaGiamGia {
public static void main(String[] args) {
String[] danhSachMa = {"CAFE10", "LATTE20", "MOCHA30", "VIP50"};
String maKhachNhap = "MOCHA30";
boolean timThay = false;

System.out.println("🔍 Kiểm tra mã: " + maKhachNhap + "\n");

for (int i = 0; i < danhSachMa.length; i++) {
System.out.println("Đang kiểm tra: " + danhSachMa[i]);

if (danhSachMa[i].equals(maKhachNhap)) {
System.out.println("✅ Mã hợp lệ! Giảm 30%");
timThay = true;
break; // Tìm thấy, dừng tìm
}
}

if (!timThay) {
System.out.println("❌ Mã không hợp lệ!");
}
}
}

Ví Dụ 4: Vòng Lặp Lồng - Break Trong While

public class PhucVuKhach {
public static void main(String[] args) {
int soKhach = 1;
int tongDoanhThu = 0;
int mucTieuDoanhThu = 500000;

System.out.println("🎯 Mục tiêu: " + mucTieuDoanhThu + " VND\n");

while (true) { // Vòng lặp vô hạn
int tienKhach = soKhach * 50000; // 50k/khách
tongDoanhThu += tienKhach;

System.out.printf("☕ Khách %d: +%,d VND (Tổng: %,d VND)%n",
soKhach, tienKhach, tongDoanhThu);

if (tongDoanhThu >= mucTieuDoanhThu) {
System.out.println("\n🎉 Đạt mục tiêu! Đóng cửa.");
break; // Đạt mục tiêu, thoát vòng lặp
}

soKhach++;
}
}
}

Output:

🎯 Mục tiêu: 500,000 VND

☕ Khách 1: +50,000 VND (Tổng: 50,000 VND)
☕ Khách 2: +100,000 VND (Tổng: 150,000 VND)
☕ Khách 3: +150,000 VND (Tổng: 300,000 VND)
☕ Khách 4: +200,000 VND (Tổng: 500,000 VND)

🎉 Đạt mục tiêu! Đóng cửa.

Ví Dụ 5: Vòng Lặp Lồng - Break & Continue

public class KiemTraDonHang {
public static void main(String[] args) {
String[][] donHang = {
{"Latte", "Mocha", "Espresso"}, // Bàn 1
{"Cappuccino", "", "Americano"}, // Bàn 2 (có món trống)
{"Latte", "Latte", "Latte"} // Bàn 3
};

for (int ban = 0; ban < donHang.length; ban++) {
System.out.println("\n🪑 BÀN " + (ban + 1) + ":");

for (int mon = 0; mon < donHang[ban].length; mon++) {
// Bỏ qua món trống
if (donHang[ban][mon].isEmpty()) {
System.out.println(" ⏭️ Món " + (mon + 1) + ": Trống (bỏ qua)");
continue;
}

// Kiểm tra món đặc biệt
if (donHang[ban][mon].equals("VIP")) {
System.out.println(" 🌟 Phát hiện đơn VIP! Ưu tiên ngay!");
break; // Dừng kiểm tra bàn này
}

System.out.println(" ☕ Món " + (mon + 1) + ": " + donHang[ban][mon]);
}
}
}
}

🔥 Thực Hành Trong Quán

Bài Tập 1: Tìm Số Chẵn Đầu Tiên

public class TimSoChan {
public static void main(String[] args) {
int[] soKhach = {15, 23, 17, 20, 31, 18};

System.out.println("🔍 Tìm khách số chẵn đầu tiên:");

for (int i = 0; i < soKhach.length; i++) {
if (soKhach[i] % 2 == 0) {
System.out.println("✅ Tìm thấy: Khách số " + soKhach[i]);
break; // Tìm thấy, dừng
}
System.out.println(" Kiểm tra: " + soKhach[i] + " (lẻ)");
}
}
}

Bài Tập 2: Bỏ Qua Số Âm

public class TinhTongDuong {
public static void main(String[] args) {
int[] giaoDich = {50000, -10000, 30000, -5000, 40000, 20000};
int tongThu = 0;

System.out.println("💰 TÍNH TỔNG THU:");

for (int tien : giaoDich) {
if (tien < 0) {
System.out.println("❌ " + tien + " (bỏ qua - âm)");
continue; // Bỏ qua số âm
}

tongThu += tien;
System.out.printf("✅ +%,d VND (Tổng: %,d)%n", tien, tongThu);
}

System.out.printf("%n💵 TỔNG THU NHẬP: %,d VND%n", tongThu);
}
}

Bài Tập 3: Giới Hạn Số Ly Mỗi Khách

public class GioiHanLy {
public static void main(String[] args) {
int gioiHanMoiKhach = 3;
int soKhach = 5;

for (int khach = 1; khach <= soKhach; khach++) {
System.out.println("\n👤 KHÁCH " + khach + ":");

for (int ly = 1; ly <= 10; ly++) { // Khách có thể đặt nhiều ly
if (ly > gioiHanMoiKhach) {
System.out.println(" ⛔ Đã đạt giới hạn " + gioiHanMoiKhach + " ly!");
break; // Dừng pha cho khách này
}
System.out.println(" ☕ Ly thứ " + ly + " - OK");
}
}
}
}

Bài Tập 4: Tìm Và Dừng (Search Pattern)

public class TimKhachVIP {
public static void main(String[] args) {
String[] danhSachKhach = {
"Anh Minh",
"Chị Lan",
"VIP_Premium",
"Anh Tùng",
"Chị Hoa"
};

System.out.println("🔍 TÌM KHÁCH VIP:\n");

for (int i = 0; i < danhSachKhach.length; i++) {
System.out.println("Kiểm tra: " + danhSachKhach[i]);

if (danhSachKhach[i].startsWith("VIP")) {
System.out.println("🌟 Tìm thấy VIP: " + danhSachKhach[i]);
System.out.println("🎁 Tặng quà ngay!");
break;
}
}
}
}

Bài Tập 5: Kết Hợp Break & Continue

public class QuanLyKho {
public static void main(String[] args) {
String[] sanPham = {"Cà phê", "Sữa", "Đường", "Ly", "Ống hút"};
int[] soLuong = {50, 0, 100, 5, 200};
int nguongCanBoSung = 10;

System.out.println("📦 KIỂM TRA KHO:\n");

for (int i = 0; i < sanPham.length; i++) {
// Bỏ qua nếu đủ hàng
if (soLuong[i] >= nguongCanBoSung) {
System.out.println("✅ " + sanPham[i] + ": " + soLuong[i] + " (đủ)");
continue;
}

// Cảnh báo nếu sắp hết
if (soLuong[i] > 0 && soLuong[i] < nguongCanBoSung) {
System.out.println("⚠️ " + sanPham[i] + ": " + soLuong[i] + " (sắp hết)");
continue;
}

// Dừng nếu hết hàng quan trọng
if (soLuong[i] == 0) {
System.out.println("❌ " + sanPham[i] + ": HẾT HÀNG!");
System.out.println("🚨 Cần bổ sung ngay! Dừng kiểm tra.");
break;
}
}
}
}

⚠️ Lỗi Thường Gặp

Lỗi 1: Dùng break Ngoài Vòng Lặp

// ❌ SAI: break ngoài vòng lặp
public class LoiBreak {
public static void main(String[] args) {
int x = 5;
if (x > 3) {
break; // ❌ Lỗi! break chỉ dùng trong loop/switch
}
}
}

// ✅ ĐÚNG: break trong vòng lặp
public class DungBreak {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // ✅ OK
}
}
}
}

Lỗi 2: Vòng Lặp Vô Hạn Thiếu break

// ❌ SAI: Vòng lặp vô hạn
public class VoHan {
public static void main(String[] args) {
int count = 0;
while (true) {
System.out.println(count);
count++;
// Thiếu break → chạy mãi!
}
}
}

// ✅ ĐÚNG: Có điều kiện break
public class CoBreak {
public static void main(String[] args) {
int count = 0;
while (true) {
System.out.println(count);
count++;
if (count >= 5) {
break; // ✅ Dừng khi đủ 5
}
}
}
}

Lỗi 3: Continue Trong Vòng Lặp Sai

// ❌ SAI: continue sau return
public class LoiContinue {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i == 3) {
System.out.println("Xong");
return; // Thoát method
continue; // ❌ Code không bao giờ chạy!
}
}
}
}

// ✅ ĐÚNG: Dùng đúng continue
public class DungContinue {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // ✅ Bỏ qua i=3
}
System.out.println(i);
}
}
}

Lỗi 4: Nhầm Lẫn break Trong Vòng Lặp Lồng

// ❌ SAI: break chỉ thoát vòng trong
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break; // Chỉ thoát vòng j, không thoát vòng i
}
System.out.println(i + "-" + j);
}
}

// ✅ ĐÚNG: Dùng label để thoát cả 2 vòng
ngoai:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break ngoai; // ✅ Thoát cả vòng ngoài
}
System.out.println(i + "-" + j);
}
}

💡 Bí Quyết Của Barista

  1. break = Thoát hẳn: Dừng vòng lặp ngay lập tức
  2. continue = Bỏ qua: Nhảy sang lượt lặp tiếp theo
  3. Chỉ dùng trong vòng lặp: break/continue chỉ dùng trong for/while/do-while/switch
  4. Tránh vòng lặp vô hạn: Luôn có điều kiện break khi dùng while(true)
  5. Label cho vòng lồng: Dùng label để break/continue vòng ngoài

🎓 Bạn Đã Học Được

  • break = Thoát khỏi vòng lặp hoàn toàn
  • continue = Bỏ qua lượt lặp hiện tại
  • ✅ Dùng trong for, while, do-while, switch
  • ✅ Ứng dụng: Tìm kiếm, validation, xử lý điều kiện
  • ✅ Label để điều khiển vòng lặp lồng
  • ✅ Tránh vòng lặp vô hạn với break

☕ Món Tiếp Theo

Đã biết điều khiển vòng lặp! Giờ học về mảng đơn:

👉 Mảng Đơn - Single Dimensional Arrays


💡 Lời Khuyên Cuối: break và continue giống như nút điều khiển trong quán - biết khi nào dừng, khi nào bỏ qua sẽ giúp xử lý hiệu quả hơn!