Menu
CoddyTech

Dùng enum cho các hằng số có tên

Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 55 trên 63.

Khi viết chương trình C, bạn thường cần làm việc với các tập hợp giá trị hằng số có liên quan. Ví dụ, bạn có thể cần biểu diễn các ngày trong tuần, các tháng trong năm hoặc những trạng thái khác nhau trong chương trình. Thay vì dùng các số như 0, 1, 2, bạn có thể dùng enum để tạo tên có ý nghĩa cho các hằng số này.

Kiểu liệt kê, hay enum, cho phép bạn định nghĩa một nhóm các hằng số nguyên có tên. Nhờ đó, code của bạn dễ đọc và dễ bảo trì hơn nhiều. Đây là cú pháp cơ bản:

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

Theo mặc định, tên đầu tiên có giá trị 0, tên thứ hai có giá trị 1, và cứ tiếp tục như vậy. Vì thế, MONDAY bằng 0, TUESDAY bằng 1 và SUNDAY bằng 6. Cách này rõ ràng hơn nhiều so với việc phải nhớ rằng ngày 0 là thứ Hai hay ngày 6 là Chủ nhật.

Dùng enum giúp code của bạn tự giải thích và ngăn ngừa các lỗi có thể xảy ra khi dùng các số ma thuật trong chương trình.

Bạn có thể khai báo biến có kiểu enum và gán các giá trị enum cho chúng:

enum DayOfWeek today;
today = MONDAY;  // gán 0 cho today
challenge icon

Thử thách

Dễ

Tạo một chương trình C định nghĩa enum cho các màu đèn giao thông và minh họa cách sử dụng. Chương trình của bạn cần:

  1. Định nghĩa một enum có tên TrafficLight với các hằng số theo đúng thứ tự sau:
    • RED
    • YELLOW
    • GREEN
  2. Trong hàm main:
    • Khai báo một biến có kiểu enum TrafficLight tên là currentLight
    • Đọc một số nguyên từ đầu vào, biểu thị trạng thái đèn giao thông (0, 1 hoặc 2)
    • Gán giá trị enum tương ứng cho currentLight dựa trên đầu vào:
      • Nếu đầu vào là 0, gán RED
      • Nếu đầu vào là 1, gán YELLOW
      • Nếu đầu vào là 2, gán GREEN
    • In trạng thái đèn hiện tại theo đúng định dạng sau: Current light: [enum_name]
    • In giá trị số của đèn hiện tại theo đúng định dạng sau: Numeric value: [number]
    • Xác định và in hành động dựa trên đèn hiện tại:
      • Nếu là RED: in Action: Stop
      • Nếu là YELLOW: in Action: Caution
      • Nếu là GREEN: in Action: Go
    • Tính toán và in đèn tiếp theo trong trình tự:
      • Nếu đèn hiện tại là RED (0), đèn tiếp theo là GREEN (2)
      • Nếu đèn hiện tại là YELLOW (1), đèn tiếp theo là RED (0)
      • Nếu đèn hiện tại là GREEN (2), đèn tiếp theo là YELLOW (1)
    • In đèn tiếp theo theo đúng định dạng sau: Next light: [enum_name]

Thử thách này minh họa cách các hằng số enum giúp code dễ đọc hơn so với việc dùng các số thô. Thay vì phải nhớ 0 nghĩa là đỏ, 1 nghĩa là vàng và 2 nghĩa là xanh lá, bạn có thể dùng các tên có ý nghĩa như RED, YELLOW và GREEN. Bạn sẽ luyện tập cách định nghĩa enum, dùng các hằng số enum trong phép gán và phép so sánh, cũng như truy cập các giá trị số nguyên nền tảng của hằng số enum.

Tự làm thử

#include <stdio.h>

// TODO: Định nghĩa enum TrafficLight tại đây

int main() {
    // Đọc đầu vào
    int input;
    scanf("%d", &input);
    
    // TODO: Khai báo biến currentLight và gán giá trị enum dựa trên đầu vào
    
    // TODO: In ra trạng thái đèn hiện tại
    
    // TODO: In ra giá trị số
    
    // TODO: In ra hành động dựa trên đèn hiện tại
    
    // TODO: Tính và in ra đèn tiếp theo
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch C online