Enumeration (hoặc enum) trong C

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ cùng nhau lặn sâu vào thế giới kỳ diệu của các enumerations trong C. Như một người giáo viên khoa học máy tính gần gũi, tôi rất vui mừng được hướng dẫn các bạn trong hành trình này. Hãy chuẩn bị đồ uống yêu thích của bạn, ngồi舒适的, và cùng nhau bắt đầu cuộc phiêu lưu này nhé!

C - Enumeration (or enum)

什么是 Enumeration (hoặc enum) trong C?

Hãy tưởng tượng bạn đang tổ chức tủ quần áo của mình. Bạn có thể phân loại quần áo của mình thành các loại khác nhau: áo, quần, váy, v.v. Trong lập trình C, một enumeration (hoặc enum cho简称) giống như việc tạo một danh mục tùy chỉnh cho mã của bạn. Đó là cách để định nghĩa một nhóm các hằng số có tên, giúp mã của bạn dễ đọc và tổ chức hơn.

Hãy bắt đầu với một ví dụ đơn giản:

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

Trong ví dụ này, chúng ta đã tạo một enum gọi là Days. Mỗi mục trong enum (MONDAY, TUESDAY, v.v.) được gọi là một enumerator. Mặc định, C sẽ gán các giá trị số nguyên cho các enumerator này, bắt đầu từ 0. Vì vậy, MONDAY là 0, TUESDAY là 1, và vân vân.

Định nghĩa và Khai báo một Kiểu Enum

Bây giờ chúng ta đã hiểu enum là gì, hãy cùng xem cách định nghĩa và khai báo một enum:

enum Fruits {
APPLE,
BANANA,
ORANGE,
MANGO
};

int main() {
enum Fruits favorite = MANGO;
printf("Fruit favorite is number %d\n", favorite);
return 0;
}

Trong ví dụ này, chúng ta đã định nghĩa một enum gọi là Fruits. Sau đó, trong hàm main, chúng ta đã khai báo một biến favorite kiểu enum Fruits và gán giá trị MANGO cho nó. Khi chúng ta in favorite, nó sẽ ra 3, vì MANGO là mục thứ tư trong enum của chúng ta (nhớ là chúng ta bắt đầu đếm từ 0).

Khai báo Biến Enum

Có một vài cách để khai báo các biến enum. Hãy cùng xem xét chúng:

enum Colors {RED, GREEN, BLUE};

// Phương pháp 1: Khai báo biến riêng lẻ
enum Colors paint;
paint = GREEN;

// Phương pháp 2: Khai báo và khởi tạo trong một dòng
enum Colors sky = BLUE;

// Phương pháp 3: Sử dụng typedef cho tiện lợi
typedef enum {CIRCLE, SQUARE, TRIANGLE} Shape;
Shape myShape = TRIANGLE;

Mỗi phương pháp này đều đạt được同一个 mục tiêu: tạo một biến của kiểu enum. Chọn phương pháp mà bạn thấy tự nhiên nhất!

Thay đổi Giá trị các Hằng số Enum

Mặc định, các hằng số enum được gán các giá trị số nguyên tăng dần bắt đầu từ 0. Nhưng nếu chúng ta muốn thay đổi các giá trị này thì sao? Tin tốt là chúng ta có thể làm điều đó:

enum Months {
JAN = 1,
FEB,
MAR,
APR = 100,
MAY,
JUN
};

Trong ví dụ này, JAN được đặt explicitly là 1, vì vậy FEB sẽ là 2 và MAR sẽ là 3. Sau đó APR được đặt là 100, vì vậy MAY sẽ là 101 và JUN sẽ là 102.

Sử dụng Enum trong Câu lệnh Switch

Enums đặc biệt hữu ích trong các câu lệnh switch. Chúng giúp mã của bạn dễ đọc hơn và ít lỗi hơn. Hãy xem một ví dụ:

enum Weekday {MON, TUE, WED, THU, FRI};

enum Weekday today = WED;

switch(today) {
case MON:
printf("It's Monday. Time to start the week!\n");
break;
case TUE:
printf("It's Tuesday. Keep the momentum going!\n");
break;
case WED:
printf("It's Wednesday. Halfway there!\n");
break;
case THU:
printf("It's Thursday. The weekend is almost here!\n");
break;
case FRI:
printf("It's Friday. Time to celebrate!\n");
break;
default:
printf("It's the weekend! Enjoy!\n");
}

Câu lệnh switch này rõ ràng hơn nhiều so với việc sử dụng các giá trị số nguyên. Nó ngay lập tức显而易见 each case đại diện cho điều gì.

Ví dụ về Kiểu Enumeration (enum)

Hãy xem một vài ví dụ khác để củng cố sự hiểu biết của chúng ta:

Ví dụ 1: Đèn giao thông

enum TrafficLight {
RED,
YELLOW,
GREEN
};

enum TrafficLight light = YELLOW;

if (light == RED) {
printf("Stop!\n");
} else if (light == YELLOW) {
printf("Prepare to stop.\n");
} else if (light == GREEN) {
printf("Go!\n");
}

Ví dụ 2: Bài bài

enum Suit {HEARTS, DIAMONDS, CLUBS, SPADES};
enum Rank {ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING};

struct Card {
enum Suit suit;
enum Rank rank;
};

struct Card myCard = {HEARTS, QUEEN};

printf("My card is the %d of %d\n", myCard.rank, myCard.suit);

Ứng dụng của Enums

Enums có nhiều ứng dụng thực tế trong lập trình. Dưới đây là một vài ví dụ:

  1. Machines State: Enums có thể đại diện cho các trạng thái khác nhau trong một hệ thống.
  2. Menu Options: Enums có thể được sử dụng để đại diện cho các lựa chọn trong một menu.
  3. Error Codes: Các loại lỗi khác nhau có thể được đại diện bởi các giá trị enum.
  4. Configuration Options: Enums có thể đại diện cho các tùy chọn cấu hình khác nhau.

Dưới đây là bảng tóm tắt một vài phương pháp thông dụng của enum:

Phương pháp Mô tả Ví dụ
Declaration Khai báo một enum type enum Colors {RED, GREEN, BLUE};
Variable Creation Tạo một biến của enum type enum Colors paint = GREEN;
Value Assignment Gán các giá trị cụ thể cho các hằng số enum enum Months {JAN = 1, FEB, MAR};
Typedef Tạo một type definition cho một enum typedef enum {CIRCLE, SQUARE} Shape;
Switch Usage Sử dụng enum trong một câu lệnh switch switch(shape) { case CIRCLE: ... }

Và đó là tất cả! Bây giờ bạn đã được giới thiệu về thế giới của các enumerations trong C. Nhớ rằng, enums là bạn của bạn. Chúng giúp mã của bạn dễ đọc hơn, tổ chức hơn và ít lỗi hơn. Trong hành trình lập trình của bạn, bạn sẽ tìm thấy nhiều tình huống mà enums có thể làm cho cuộc sống của bạn dễ dàng hơn. Chúc các bạn lập trình vui vẻ, và may mắn với các enum của bạn luôn luôn ngăn nắp!

Credits: Image by storyset