🔥 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
- Dùng switch thay vì nhiều if/else: Code dễ đọc hơn
- for range khi duyệt slice/map: An toàn và ngắn gọn
- Luôn có default trong switch: Xử lý trường hợp ngoại lệ
- break/continue cẩn thận: Đảm bảo logic đúng
- 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!