Skip to main content

🔁 Pha Nhiều Ly - For Loops

Chào mừng đến với bài học về For Loops - cách pha nhiều ly cà phê giống nhau trong Café Âu!

🎯 Món Ăn Hôm Nay

Tưởng tượng bạn là barista nhận đơn hàng:

  • Khách đặt 10 ly Latte → Phải pha 10 lần giống nhau
  • Mỗi ly đều chuẩn: 18.5g cà phê + 100ml sữa
  • Đếm từng ly: Ly 1, ly 2, ly 3... ly 10

Đó chính là For Loop - lặp lại công việc có số lần xác định!

☕ For Loop Là Gì?

For Loop = Pha nhiều ly theo số lượng đã biết (lặp lại công việc)

// Pha 10 ly Latte
for (int ly = 1; ly <= 10; ly++) {
System.out.println("☕ Đang pha ly thứ " + ly);
}

Cấu trúc:

for (khởi tạo; điều kiện; bước nhảy) {
// Công việc lặp lại
}

Ẩn Dụ Café:

  • int ly = 1 = Bắt đầu từ ly số 1
  • ly <= 10 = Pha cho đến ly thứ 10
  • ly++ = Sau mỗi ly, tăng số đếm lên 1
  • {...} = Công thức pha chế

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

Sáng nay, quán café nhận đơn đặt hàng lớn:

Tình huống 1: Pha 5 ly Espresso

System.out.println("🎯 Nhận đơn: 5 ly Espresso\n");

for (int ly = 1; ly <= 5; ly++) {
System.out.println("☕ Đang pha ly Espresso thứ " + ly + "...");
System.out.println(" → Dùng 18g cà phê");
}

System.out.println("\n✅ Hoàn thành 5 ly Espresso!");

Tình huống 2: Tính nguyên liệu cho đơn hàng

int soLy = 10;
double caPheMotLy = 18.5; // gram

double tongCaPhe = 0;

for (int ly = 1; ly <= soLy; ly++) {
tongCaPhe += caPheMotLy;
System.out.printf("Ly %d: Cần %.1fg cà phê (Tổng: %.1fg)\n",
ly, caPheMotLy, tongCaPhe);
}

System.out.printf("\n📦 Cần chuẩn bị: %.1fg cà phê\n", tongCaPhe);

🎉 Kết quả: For loop giúp pha nhiều ly nhanh và chính xác!

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

Ví Dụ 1: For Loop Cơ Bản

public class PhaDoUong {
public static void main(String[] args) {
// Pha 8 ly Cappuccino
int soLy = 8;

System.out.println("🎯 Đơn hàng: " + soLy + " ly Cappuccino\n");

for (int ly = 1; ly <= soLy; ly++) {
System.out.println("☕ Ly " + ly + ": Đang pha...");
}

System.out.println("\n✅ Hoàn thành " + soLy + " ly!");
}
}

Output:

🎯 Đơn hàng: 8 ly Cappuccino

☕ Ly 1: Đang pha...
☕ Ly 2: Đang pha...
☕ Ly 3: Đang pha...
☕ Ly 4: Đang pha...
☕ Ly 5: Đang pha...
☕ Ly 6: Đang pha...
☕ Ly 7: Đang pha...
☕ Ly 8: Đang pha...

✅ Hoàn thành 8 ly!

Ví Dụ 2: Tính Tổng Tiền

public class TinhTongTien {
public static void main(String[] args) {
int giaMotLy = 50000; // VND
int soLy = 5;
int tongTien = 0;

System.out.println("🧾 HÓA ĐƠN:\n");

for (int ly = 1; ly <= soLy; ly++) {
tongTien += giaMotLy;
System.out.printf("Ly %d: %,d VND (Tạm tính: %,d VND)\n",
ly, giaMotLy, tongTien);
}

System.out.println("━━━━━━━━━━━━━━━━━━━━━━");
System.out.printf("TỔNG CỘNG: %,d VND\n", tongTien);
}
}

Output:

🧾 HÓA ĐƠN:

Ly 1: 50,000 VND (Tạm tính: 50,000 VND)
Ly 2: 50,000 VND (Tạm tính: 100,000 VND)
Ly 3: 50,000 VND (Tạm tính: 150,000 VND)
Ly 4: 50,000 VND (Tạm tính: 200,000 VND)
Ly 5: 50,000 VND (Tạm tính: 250,000 VND)
━━━━━━━━━━━━━━━━━━━━━━
TỔNG CỘNG: 250,000 VND

Ví Dụ 3: For Loop Lồng Nhau - Menu Cả Tuần

public class MenuTuan {
public static void main(String[] args) {
String[] thuTrongTuan = {"T2", "T3", "T4", "T5", "T6", "T7", "CN"};
String[] doUong = {"Latte", "Cappuccino", "Espresso"};

System.out.println("📋 MENU ĐỒ UỐNG CẢ TUẦN:\n");

for (int ngay = 0; ngay < thuTrongTuan.length; ngay++) {
System.out.println("📅 " + thuTrongTuan[ngay] + ":");

for (int mon = 0; mon < doUong.length; mon++) {
System.out.println(" ☕ " + doUong[mon]);
}

System.out.println();
}
}
}

Output:

📋 MENU ĐỒ UỐNG CẢ TUẦN:

📅 T2:
☕ Latte
☕ Cappuccino
☕ Espresso

📅 T3:
☕ Latte
☕ Cappuccino
☕ Espresso

... (tiếp tục đến CN)

Ví Dụ 4: For-Each Loop - Duyệt Menu

public class DuyetMenu {
public static void main(String[] args) {
String[] menu = {"Latte", "Cappuccino", "Espresso", "Mocha"};
int[] gia = {50000, 45000, 40000, 55000};

System.out.println("📋 BẢNG GIÁ ĐỒ UỐNG:\n");

// For-each đơn giản hơn
for (String mon : menu) {
System.out.println("☕ " + mon);
}

System.out.println("\n💰 CHI TIẾT:\n");

// For thường khi cần index
for (int i = 0; i < menu.length; i++) {
System.out.printf("%-15s: %,d VND\n", menu[i], gia[i]);
}
}
}

Output:

📋 BẢNG GIÁ ĐỒ UỐNG:

☕ Latte
☕ Cappuccino
☕ Espresso
☕ Mocha

💰 CHI TIẾT:

Latte : 50,000 VND
Cappuccino : 45,000 VND
Espresso : 40,000 VND
Mocha : 55,000 VND

Ví Dụ 5: Tính Doanh Thu Theo Giờ

public class DoanhThuTheoGio {
public static void main(String[] args) {
int gioMoCua = 7; // 7h sáng
int gioDongCua = 22; // 10h tối
int lyMotGio = 15;
int giaMotLy = 50000;

System.out.println("📊 DOANH THU THEO GIỜ:\n");

int tongLy = 0;
long tongTien = 0;

for (int gio = gioMoCua; gio < gioDongCua; gio++) {
int lyTrongGio = lyMotGio;
long tienTrongGio = lyTrongGio * giaMotLy;

tongLy += lyTrongGio;
tongTien += tienTrongGio;

System.out.printf("%02d:00 - %02d:00 | %2d ly | %,10d VND\n",
gio, gio + 1, lyTrongGio, tienTrongGio);
}

System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
System.out.printf("TỔNG CỘNG | %2d ly | %,10d VND\n", tongLy, tongTien);
}
}

Output:

📊 DOANH THU THEO GIỜ:

07:00 - 08:00 | 15 ly | 750,000 VND
08:00 - 09:00 | 15 ly | 750,000 VND
09:00 - 10:00 | 15 ly | 750,000 VND
... (tiếp tục đến 22:00)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TỔNG CỘNG | 225 ly | 11,250,000 VND

🔥 Thực Hành Trong Quán

Bài Tập 1: Hệ Thống Đặt Hàng

public class HeThongDatHang {
public static void main(String[] args) {
String[] donHang = {"Latte", "Espresso", "Latte", "Cappuccino", "Latte"};

// Đếm số lượng từng món
int soLatte = 0;
int soEspresso = 0;
int soCappuccino = 0;

for (String mon : donHang) {
if (mon.equals("Latte")) {
soLatte++;
} else if (mon.equals("Espresso")) {
soEspresso++;
} else if (mon.equals("Cappuccino")) {
soCappuccino++;
}
}

System.out.println("📋 TỔNG KẾT ĐƠN HÀNG:\n");
System.out.println("☕ Latte: " + soLatte + " ly");
System.out.println("☕ Espresso: " + soEspresso + " ly");
System.out.println("☕ Cappuccino: " + soCappuccino + " ly");
System.out.println("\n📦 Tổng: " + donHang.length + " ly");
}
}

Bài Tập 2: In Bảng Nhân - Bảng Giá

public class BangGiaCombo {
public static void main(String[] args) {
int giaMotLy = 45000;

System.out.println("💰 BẢNG GIÁ COMBO (45,000 VND/ly):\n");

for (int soLy = 1; soLy <= 10; soLy++) {
int tongTien = giaMotLy * soLy;
System.out.printf("%2d ly = %,d VND", soLy, tongTien);

// Giảm giá từ 5 ly trở lên
if (soLy >= 5) {
int giamGia = (int)(tongTien * 0.1);
int thanhToan = tongTien - giamGia;
System.out.printf(" → Giảm 10%%: %,d VND ✨", thanhToan);
}

System.out.println();
}
}
}

Bài Tập 3: Tìm Món Bán Chạy Nhất

public class MonBanChay {
public static void main(String[] args) {
String[] tenMon = {"Latte", "Cappuccino", "Espresso", "Mocha"};
int[] daBan = {45, 38, 52, 30};

// Tìm món bán chạy nhất
int maxSoLuong = daBan[0];
String monBanChay = tenMon[0];

for (int i = 0; i < tenMon.length; i++) {
System.out.printf("☕ %-15s: %2d ly\n", tenMon[i], daBan[i]);

if (daBan[i] > maxSoLuong) {
maxSoLuong = daBan[i];
monBanChay = tenMon[i];
}
}

System.out.println("\n🏆 MÓN BÁN CHẠY NHẤT:");
System.out.printf(" %s - %d ly\n", monBanChay, maxSoLuong);
}
}

Bài Tập 4: Kiểm Tra Nguyên Liệu

public class KiemTraNguyenLieu {
public static void main(String[] args) {
int[] donHang = {10, 5, 8, 12}; // Số ly mỗi loại
double caPheMotLy = 18.5; // gram
double suaMotLy = 100.0; // ml

System.out.println("📦 KIỂM TRA NGUYÊN LIỆU:\n");

double tongCaPhe = 0;
double tongSua = 0;

for (int i = 0; i < donHang.length; i++) {
double canCaPhe = donHang[i] * caPheMotLy;
double canSua = donHang[i] * suaMotLy;

tongCaPhe += canCaPhe;
tongSua += canSua;

System.out.printf("Đơn %d (%2d ly): %.1fg cà phê, %.0fml sữa\n",
i + 1, donHang[i], canCaPhe, canSua);
}

System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
System.out.printf("TỔNG CỘNG: %.1fg cà phê, %.0fml sữa\n",
tongCaPhe, tongSua);
}
}

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

Lỗi 1: Lặp Vô Hạn

// ❌ SAI: Biến đếm không tăng
for (int ly = 1; ly <= 10; ) { // Thiếu ly++
System.out.println("Ly " + ly);
// Lặp vô hạn!
}

// ✅ ĐÚNG: Có bước tăng
for (int ly = 1; ly <= 10; ly++) {
System.out.println("Ly " + ly);
}

Lỗi 2: Off-By-One Error - Sai Số Lượng

int[] menu = {"Latte", "Cappuccino", "Espresso"};

// ❌ SAI: Vượt quá mảng (0, 1, 2, 3 → lỗi!)
for (int i = 0; i <= menu.length; i++) { // Sai <=
System.out.println(menu[i]); // ArrayIndexOutOfBoundsException!
}

// ✅ ĐÚNG: Dùng < thay vì <=
for (int i = 0; i < menu.length; i++) {
System.out.println(menu[i]);
}

Lỗi 3: Thay Đổi Biến Đếm Trong Loop

// ❌ SAI: Thay đổi biến đếm
for (int ly = 1; ly <= 10; ly++) {
System.out.println("Ly " + ly);
ly++; // Tăng thêm → nhảy cóc!
}

// ✅ ĐÚNG: Chỉ dùng ly++ ở phần for
for (int ly = 1; ly <= 10; ly++) {
System.out.println("Ly " + ly);
}

Lỗi 4: Điều Kiện Sai

// ❌ SAI: Điều kiện luôn đúng
for (int ly = 10; ly > 0; ly++) { // ly tăng mãi!
System.out.println("Ly " + ly);
}

// ✅ ĐÚNG: Điều kiện đúng với bước nhảy
for (int ly = 10; ly > 0; ly--) { // Đếm ngược
System.out.println("Ly " + ly);
}

💡 Bí Quyết Của Barista

  1. For thường khi cần index: for (int i = 0; i &lt; n; i++)
  2. For-each khi chỉ duyệt: for (String mon : menu)
  3. Kiểm tra điều kiện dừng: Tránh vòng lặp vô hạn
  4. Dùng < thay vì <=: Với array.length (0-indexed)
  5. Biến đếm rõ ràng: ly, mon, index thay vì i, j

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

  • ✅ For loop = Lặp lại công việc có số lần xác định
  • ✅ for (khởi tạo; điều kiện; bước) = Cấu trúc cơ bản
  • ✅ For-each = Duyệt mảng/collection đơn giản
  • ✅ For lồng nhau = Lặp đa cấp (menu × ngày)
  • ✅ Tránh vòng lặp vô hạn và off-by-one error

☕ Món Tiếp Theo

Đã biết lặp với số lần xác định! Giờ học lặp theo điều kiện:

👉 Lặp Linh Hoạt - While Loops


💡 Lời Khuyên Cuối: For loop giống pha nhiều ly café - chuẩn từng bước thì mỗi ly đều hoàn hảo! Thực hành nhiều để trở thành barista chuyên nghiệp!