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 todayThử 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:
- Định nghĩa một
enumcó tênTrafficLightvới các hằng số theo đúng thứ tự sau:REDYELLOWGREEN
- Trong hàm main:
- Khai báo một biến có kiểu
enum TrafficLighttê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
currentLightdự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
- Nếu đầu vào là 0, gán
- 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: inAction: Stop - Nếu là
YELLOW: inAction: Caution - Nếu là
GREEN: inAction: Go
- Nếu là
- 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)
- Nếu đèn hiện tại là
- In đèn tiếp theo theo đúng định dạng sau:
Next light: [enum_name]
- Khai báo một biến có kiểu
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;
}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
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự7Cấu trúc (struct)
Struct là gì?Khai báo structTạo biến structTruy cập thành viên của structKhởi tạo structÔn tập: struct dữ liệu học sinh10Enum và typedef
Dùng enum cho các hằng số có tênKhai báo và sử dụng enumEnum trong câu lệnh switchDùng typedef để tạo bí danh kiểutypedef với structÔn tập: Luyện tập typedef và enum2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online