CodeGym /Các khóa học /C# SELF /If lồng nhau, logic nhiều tầng

If lồng nhau, logic nhiều tầng

C# SELF
Mức độ , Bài học
Có sẵn

1. Cú pháp cơ bản của if lồng nhau

Ở ngoài đời hiếm khi nào quyết định chỉ dựa trên một tiêu chí duy nhất. Thường thì phải kiểm tra nhiều điều kiện cùng lúc, và chúng lại còn phụ thuộc vào nhau nữa. Ví dụ, để vào concert, không chỉ cần là người lớn — đôi khi còn phải có tên trong danh sách mời nữa cơ. Đó là lúc cái gọi là logic nhiều tầng xuất hiện, và giúp mình xử lý là các toán tử if lồng nhau.

Điều kiện lồng nhau — tức là một if nằm trong một if khác. Hãy tưởng tượng hộp trong hộp: nếu hộp đầu tiên mở được (điều kiện đúng), thì mới xem bên trong và có thể mở hộp thứ hai. Về mặt code và logic thì đây là công cụ rất mạnh.

Bắt đầu với ví dụ đơn giản nhé:

if (điều_kiệnA)
{
    // hành động nếu điều_kiệnA — true (đúng)
    if (điều_kiệnB)
    {
        // hành động nếu cả hai điều kiện đều đúng
    }
}
if lồng trong if khác

Nếu bạn thấy giống búp bê matryoshka — là bạn hiểu đúng rồi đó! if lồng bên trong chỉ chạy khi cái if ngoài đã đúng.

Ví dụ: vào club

Giờ mình phát triển tiếp app học tập, nơi user trước đó nhập tên và tuổi. Bây giờ thêm tầng kiểm tra thứ hai: giả sử để vào club kín, phải trên 21 tuổi có mã mời.

Console.Write("Nhập tên của bạn: ");
string name = Console.ReadLine();

Console.Write("Nhập tuổi của bạn: ");
int age = int.Parse(Console.ReadLine());

if (age >= 21)
{
    Console.Write("Nhập mã mời: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("Chào mừng, " + name + ", đến với VIP-club!");
    }
    else
    {
        Console.WriteLine("Xin lỗi, mã không đúng. Không được vào.");
    }
}
else
{
    Console.WriteLine("Xin lỗi, chỉ vào từ 21 tuổi trở lên!");
}

Lưu ý: if bên trong chỉ kiểm tra mã khi tuổi đã qua kiểm tra. Như vậy tiết kiệm tài nguyên (và không làm bảo vệ khó chịu).

2. Bao nhiêu tầng lồng nhau là ổn?

Về kỹ thuật thì bao nhiêu cũng được. Nhưng thực tế — càng nhiều tầng lồng thì code càng khó đọc và bảo trì. Thường thì hiếm khi dùng quá 2-3 tầng lồng. Nếu bạn thấy mình đang viết “cầu thang” với 4 tầng if trở lên, nên nghĩ lại: có thể đơn giản hóa logic hoặc tách kiểm tra ra hàm riêng (mà cái này là chủ đề bài khác luôn!).

3. If lồng và else: bẫy và lưu ý

Lỗi newbie hay gặp: lười viết dấu ngoặc nhọn.

Khi bạn viết điều kiện lồng, nhất là khi dùng else, C# rất nghiêm về cú pháp. Nếu không thêm dấu ngoặc nhọn {}, thì if hoặc else chỉ áp dụng cho dòng đầu tiên sau nó thôi. Đây là nguồn gốc của nhiều bug khó chịu.

Ví dụ dễ dính lỗi:

if (age >= 21)
    if (code == "VIP2024")
        Console.WriteLine("Chào mừng!");
else
    Console.WriteLine("Mã không đúng.");

Nhiều bạn tưởng else là kiểm tra tuổi, nhưng thực ra nó gắn với if gần nhất (kiểm tra mã mời). Vì vậy thông báo có thể không như mong đợi. Tốt nhất luôn dùng ngoặc nhọn — dù chỉ có một dòng bên trong!

Để khỏi nhầm, mình cho xem lại. Compiler hiểu đoạn code trên như sau:

if (age >= 21)
{    
    if (code == "VIP2024")
        Console.WriteLine("Chào mừng!");
else
    Console.WriteLine("Mã không đúng.");
}    

Quan trọng! Nhắc lại:
Nếu trong if-else không có ngoặc nhọn, else sẽ gắn với if gần nhất trước nó.

4. Thay thế: else if trong điều kiện lồng

Đôi khi trong if ngoài, bạn không chỉ muốn kiểm tra thêm một điều kiện, mà còn muốn có lựa chọn khác. Ví dụ, nếu mã mời không đúng, có thể đề nghị mua vé. Làm được bằng else if/else lồng nhau:

if (age >= 21)
{
    Console.Write("Nhập mã mời: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("Chào mừng đến club!");
    }
    else if (code == "GUEST")
    {
        Console.WriteLine("Chế độ khách: chỉ vào đến 23:00.");
    }
    else
    {
        Console.WriteLine("Tiếc quá, không vào được.");
    }
}
else
{
    Console.WriteLine("Chỉ vào từ 21 tuổi.");
}

Ở ví dụ này mình chọn giữa ba trường hợp: mã VIP, mã khách và từ chối.

5. Thực hành: máy tính giảm giá với logic nhiều tầng

Viết thử app này nhé: user được giảm giá ở shop dựa trên tuổi và có thẻ club hay không.

  • Nếu tuổi user lớn hơn hoặc bằng 60 — giảm 15%.
  • Nếu nhỏ hơn, nhưng có thẻ club — giảm 7%.
  • Còn lại thì không giảm.

Làm sao code nhỉ?

Console.Write("Nhập tuổi của bạn: ");
int age = int.Parse(Console.ReadLine());

double discount = 0.0;

if (age >= 60)
{
    discount = 0.15;
}
else
{
    Console.Write("Bạn có thẻ club không (có/không)? ");
    string hasCard = Console.ReadLine();

    if (hasCard == "có")
    {
        discount = 0.07;
    }
}

Console.WriteLine("Giảm giá của bạn: " + (discount * 100) + "%");

Ở đây mình dùng if lồng trong nhánh else. Nếu tuổi không đủ, mới hỏi về thẻ club.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION