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

🔥 Kiểm Tra Độ Chín - Control Structures

Chào mừng đến với bài học về Control Structures - cách kiểm tra độ chín và điều chỉnh lửa trong Bếp Á!

🎯 Món Ăn Hôm Nay

Tưởng tượng bạn đang nấu phở:

  • Kiểm tra nước dùng: Đủ mặn chưa? → Nếu nhạt, thêm muối
  • Kiểm tra thịt: Chín chưa? → Nếu chưa, nấu thêm
  • Lặp lại: Nấu 10 tô phở → Lặp 10 lần

Đó chính là Control Structures - giúp đầu bếp đưa ra quyết định và lặp lại công việc!

🥘 Control Structures Là Gì?

Control Structures = Cách kiểm tra và điều khiển quá trình nấu ăn

Có 3 loại chính:

  • if/else = Kiểm tra và quyết định (Nếu...thì...)
  • for = Lặp lại công việc (Nấu nhiều tô)
  • switch = Chọn công thức (Theo menu)

🍜 Ẩn Dụ Nhà Hàng:

  • if = Nếm thử → Quyết định thêm gia vị
  • for = Nấu nhiều phần
  • switch = Chọn món theo order

👨‍🍳 Câu Chuyện Trong Bếp

Sáng nay, đầu bếp Minh đang nấu phở:

Tình huống 1: Kiểm tra nước dùng

viNuocDung := "nhat"  // nhạt, vừa, mặn

if viNuocDung == "nhat" {
fmt.Println("🧂 Thêm muối vào!")
} else if viNuocDung == "man" {
fmt.Println("💧 Thêm nước!")
} else {
fmt.Println("✅ Nước dùng vừa vặn!")
}

Tình huống 2: Nấu 5 tô phở

for soBan := 1; soBan <= 5; soBan++ {
fmt.Printf("🍜 Nấu phở cho bàn %d\n", soBan)
}

🎉 Kết quả: Control structures giúp đầu bếp làm việc thông minh hơn!

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

Ví Dụ 1: if/else - Kiểm Tra Nguyên Liệu

package main

import "fmt"

func main() {
khoiLuongThit := 500 // gram

// Kiểm tra đủ thịt không
if khoiLuongThit >= 300 {
fmt.Println("✅ Đủ thịt để nấu phở!")
} else {
fmt.Println("❌ Thiếu thịt, cần đi chợ!")
}

// Kiểm tra nhiều điều kiện
if khoiLuongThit >= 500 {
fmt.Println("🍜 Nấu được 2 tô phở đặc biệt")
} else if khoiLuongThit >= 300 {
fmt.Println("🍜 Nấu được 1 tô phở bình thường")
} else {
fmt.Println("🍜 Chỉ đủ nấu phở gà")
}
}

Ví Dụ 2: for - Nấu Nhiều Món

func main() {
// Nấu 5 tô phở
fmt.Println("🏪 Bắt đầu ca sáng!")

for toThuTu := 1; toThuTu <= 5; toThuTu++ {
fmt.Printf("🍜 Tô phở số %d đã sẵn sàng!\n", toThuTu)
}

fmt.Println("✅ Hoàn thành 5 tô phở!")
}

Ví Dụ 3: for range - Duyệt Menu

func main() {
menu := []string{"Phở Bò", "Bún Chả", "Gỏi Cuốn", "Nem Rán"}

fmt.Println("📋 MENU HÔM NAY:")
for thuTu, tenMon := range menu {
fmt.Printf("%d. %s\n", thuTu+1, tenMon)
}

// Chỉ cần tên món, không cần số thứ tự
fmt.Println("\n🍜 DANH SÁCH MÓN:")
for _, tenMon := range menu {
fmt.Println("- " + tenMon)
}
}

Ví Dụ 4: switch - Chọn Món Theo Order

func main() {
monKhachGoi := "Phở Bò"

switch monKhachGoi {
case "Phở Bò":
fmt.Println("🍜 Nấu phở bò - 10 phút")
fmt.Println("🥩 Chuẩn bị thịt bò tái")
case "Bún Chả":
fmt.Println("🍲 Nướng chả - 8 phút")
fmt.Println("🔥 Đun nóng bếp than")
case "Gỏi Cuốn":
fmt.Println("🥗 Gọp gỏi cuốn - 5 phút")
fmt.Println("🥬 Rửa rau sạch")
default:
fmt.Println("❌ Món không có trong menu!")
}
}

Ví Dụ 5: switch Kiểm Tra Giá

func main() {
gia := 55000

switch {
case gia >= 50000:
fmt.Println("💰 Món cao cấp")
case gia >= 30000:
fmt.Println("💵 Món bình dân")
default:
fmt.Println("💸 Món giá rẻ")
}
}

🔥 Thực Hành Trong Bếp

Bài Tập 1: Kiểm Tra Giờ Mở Cửa

package main

import "fmt"

func main() {
gioBayGio := 8 // 8 AM

if gioBayGio >= 6 && gioBayGio <= 22 {
fmt.Println("🏪 Nhà hàng đang mở cửa!")
fmt.Println("🍜 Sẵn sàng phục vụ!")
} else {
fmt.Println("🔒 Nhà hàng đã đóng cửa")
fmt.Println("⏰ Mở cửa lúc 6 AM")
}
}

Bài Tập 2: Tính Tổng Hóa Đơn Nhiều Bàn

func main() {
giaMotTo := 50000
soBan := 10

tongDoanhThu := 0

fmt.Println("💵 TÍNH DOANH THU:")
for ban := 1; ban <= soBan; ban++ {
soTo := 2 // Mỗi bàn gọi 2 tô
tienBan := soTo * giaMotTo
tongDoanhThu += tienBan

fmt.Printf("Bàn %d: %d tô x %d = %d VND\n",
ban, soTo, giaMotTo, tienBan)
}

fmt.Printf("\n💰 TỔNG DOANH THU: %d VND\n", tongDoanhThu)
}

Bài Tập 3: Giảm Giá Theo Số Lượng

func main() {
soLuong := 15
giaMoiTo := 50000
tongTien := soLuong * giaMoiTo

fmt.Printf("🍜 Số lượng: %d tô\n", soLuong)
fmt.Printf("💵 Tạm tính: %d VND\n", tongTien)

var phanTramGiam int

switch {
case soLuong >= 20:
phanTramGiam = 20
fmt.Println("🎉 Giảm 20% - Khách VIP!")
case soLuong >= 10:
phanTramGiam = 10
fmt.Println("🎊 Giảm 10% - Khách thân thiết!")
case soLuong >= 5:
phanTramGiam = 5
fmt.Println("✨ Giảm 5%")
default:
phanTramGiam = 0
fmt.Println("📋 Giá gốc")
}

giamGia := tongTien * phanTramGiam / 100
thanhToan := tongTien - giamGia

fmt.Printf("💸 Giảm giá: %d VND\n", giamGia)
fmt.Printf("💰 THANH TOÁN: %d VND\n", thanhToan)
}

⚠️ Những Lỗi Đầu Bếp Thường Gặp

Lỗi 1: Quên Dấu Ngoặc Nhọn

// ❌ SAI: Go yêu cầu dấu { cùng dòng với if
func main() {
if gia > 50000
{
fmt.Println("Đắt")
}
}

// ✅ ĐÚNG: Dấu { cùng dòng với if
func main() {
if gia > 50000 {
fmt.Println("Đắt")
}
}

Lỗi 2: Vòng Lặp Vô Hạn

// ❌ SAI: Quên tăng biến đếm
func main() {
i := 0
for i < 10 {
fmt.Println("Nấu tô", i)
// Quên i++
}
}

// ✅ ĐÚNG: Nhớ tăng biến đếm
func main() {
i := 0
for i < 10 {
fmt.Println("Nấu tô", i)
i++
}
}

Lỗi 3: So Sánh String Sai

// ❌ SAI: So sánh trực tiếp có thể bị lỗi chữ hoa/thường
func main() {
mon := "PHỞ BÒ"
if mon == "Phở Bò" {
fmt.Println("Nấu phở")
}
}

// ✅ ĐÚNG: Chuyển về lowercase trước khi so sánh
import "strings"

func main() {
mon := "PHỞ BÒ"
if strings.ToLower(mon) == "phở bò" {
fmt.Println("Nấu phở")
}
}

Lỗi 4: Switch Fallthrough Không Mong Muốn

// ❌ SAI: Go tự động break, không cần fallthrough
func main() {
mon := "Phở"
switch mon {
case "Phở":
fmt.Println("Nấu phở")
fallthrough // Không cần thiết!
case "Bún":
fmt.Println("Nấu bún")
}
}

// ✅ ĐÚNG: Go tự động break
func main() {
mon := "Phở"
switch mon {
case "Phở":
fmt.Println("Nấu phở")
case "Bún":
fmt.Println("Nấu bún")
}
}

💡 Bí Quyết Của Đầu Bếp

  1. Dùng switch thay vì nhiều if/else: Code dễ đọc hơn
  2. for range khi duyệt slice/map: An toàn và ngắn gọn
  3. Luôn có default trong switch: Xử lý trường hợp ngoại lệ
  4. break/continue cẩn thận: Đảm bảo logic đúng
  5. Tránh vòng lặp vô hạn: Luôn có điều kiện dừng

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

  • ✅ if/else = Kiểm tra điều kiện và quyết định
  • ✅ for = Lặp lại công việc (3 cách: classic, while-style, range)
  • ✅ switch = Chọn một trong nhiều trường hợp
  • ✅ break/continue = Điều khiển vòng lặp
  • ✅ Go tự động break trong switch (không giống C/Java)

🍜 Món Tiếp Theo

Đã biết kiểm tra và lặp lại! Giờ học cách lưu trữ nhiều nguyên liệu cùng lúc:

👉 Kệ Đựng Gia Vị - Arrays & Slices


💡 Lời Khuyên Cuối: Control structures giống như kỹ năng kiểm tra món ăn của đầu bếp - càng thành thạo, càng nấu ngon! Hãy thực hành nhiều để thành master chef!