Chuỗi điều kiện

Mục đích

Chuỗi điều kiện được dùng khi bài toán có nhiều hơn hai khả năng xử lý. Các điều kiện được kiểm tra theo thứ tự từ trên xuống dưới, và chương trình chọn nhánh đầu tiên thỏa mãn.

Sơ đồ luồng

graph TD; A((Bắt đầu)) --> B{Điều kiện 1?}; B -- Đúng --> C[Khối lệnh 1]; B -- Sai --> D{Điều kiện 2?}; D -- Đúng --> E[Khối lệnh 2]; D -- Sai --> F[Khối lệnh\nmặc định]; C --> G((Tiếp tục)); E --> G; F --> G;

Ví dụ xếp loại học tập

score = 8.2

if score >= 9:
    print("Xuat sac")
elif score >= 8:
    print("Gioi")
elif score >= 6.5:
    print("Kha")
else:
    print("Can co gang them")
program GradeDemo;

var
  score: Real;

begin
  score := 8.2;

  if score >= 9 then
    Writeln('Xuat sac')
  else if score >= 8 then
    Writeln('Gioi')
  else if score >= 6.5 then
    Writeln('Kha')
  else
    Writeln('Can co gang them');
end.
#include <stdio.h>

int main(void) {
    double score = 8.2;

    if (score >= 9) {
        printf("Xuat sac\n");
    } else if (score >= 8) {
        printf("Gioi\n");
    } else if (score >= 6.5) {
        printf("Kha\n");
    } else {
        printf("Can co gang them\n");
    }

    return 0;
}
#include <iostream>
using namespace std;

int main() {
    double score = 8.2;

    if (score >= 9) {
        cout << "Xuat sac" << endl;
    } else if (score >= 8) {
        cout << "Gioi" << endl;
    } else if (score >= 6.5) {
        cout << "Kha" << endl;
    } else {
        cout << "Can co gang them" << endl;
    }

    return 0;
}
double score = 8.2;

if (score >= 9)
{
    Console.WriteLine("Xuat sac");
}
else if (score >= 8)
{
    Console.WriteLine("Gioi");
}
else if (score >= 6.5)
{
    Console.WriteLine("Kha");
}
else
{
    Console.WriteLine("Can co gang them");
}
const score = 8.2;

if (score >= 9) {
    console.log("Xuat sac");
} else if (score >= 8) {
    console.log("Gioi");
} else if (score >= 6.5) {
    console.log("Kha");
} else {
    console.log("Can co gang them");
}
const score: number = 8.2;

if (score >= 9) {
    console.log("Xuat sac");
} else if (score >= 8) {
    console.log("Gioi");
} else if (score >= 6.5) {
    console.log("Kha");
} else {
    console.log("Can co gang them");
}
package main

import "fmt"

func main() {
    score := 8.2

    if score >= 9 {
        fmt.Println("Xuat sac")
    } else if score >= 8 {
        fmt.Println("Gioi")
    } else if score >= 6.5 {
        fmt.Println("Kha")
    } else {
        fmt.Println("Can co gang them")
    }
}
fn main() {
    let score = 8.2_f64;

    if score >= 9.0 {
        println!("Xuat sac");
    } else if score >= 8.0 {
        println!("Gioi");
    } else if score >= 6.5 {
        println!("Kha");
    } else {
        println!("Can co gang them");
    }
}

Khi nào nên dùng

  • Khi số lượng trường hợp nhỏ và thứ tự kiểm tra có ý nghĩa.
  • Khi mỗi nhánh phụ thuộc vào một điều kiện khác nhau.
  • Khi muốn giữ toàn bộ quy tắc trong cùng một cấu trúc tuyến tính, dễ đọc từ trên xuống.

Ghi chú theo ngôn ngữ

Thông tin</div>

Python dùng từ khóa elif để nối thêm nhánh. Từ phiên bản 3.10, một số bài toán so khớp giá trị còn có thể dùng match-case để diễn đạt rõ hơn.

Pascal có thể viết chuỗi else if như ví dụ trên. Khi cần so khớp một giá trị rời rạc với nhiều trường hợp, case ... of thường gọn và dễ đọc hơn.

C hỗ trợ cả else if lẫn switch. switch phù hợp với so sánh theo các giá trị nguyên hoặc ký tự cố định, còn else if linh hoạt hơn với điều kiện phạm vi.

C++ có else ifswitch giống C. Với C++17, cú pháp if constexpr cho phép rẽ nhánh tại compile time. C++23 bổ sung switch với pattern matching.

C# hỗ trợ else if và cũng có switch biểu thức (expression switch) từ C# 8, cho phép viết gọn các phép so khớp giá trị.

JavaScript dùng else ifswitch. switch so khớp dùng === (so sánh nghiêm ngặt). Không quên break ở cuối mỗi case để tránh “fall-through” (chạy tiếp sang case tiếp theo).

TypeScript kế thừa else ifswitch từ JavaScript. Khi dùng union type, TypeScript có thể kiểm tra tính đầy đủ của các nhánh và cảnh báo nếu có trường hợp chưa được xử lý.

Go dùng else ifswitch. Điểm đặc biệt: switch trong Go không cần break — mỗi case tự động dừng. Cần từ khóa fallthrough nếu muốn chạy tiếp case tiếp theo.

Rust có match — tương đương nâng cao của switch/case — rất mạnh cho so khớp nhiều mẫu. if-else if vẫn dùng được cho điều kiện phạm vi số thực.

Kết luận

Chuỗi điều kiện giúp biểu diễn các quy tắc phân loại nhiều mức. Khi một nhánh lại cần thêm quyết định bên trong nó, chuyển sang Rẽ nhánh lồng nhau.

Bình luận