Enum trong câu lệnh switch
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 57 trên 63.
Một trong những cách kết hợp mạnh mẽ nhất trong lập trình C là dùng các giá trị enum với câu lệnh switch. Cách kết hợp này tạo ra luồng điều khiển đặc biệt dễ đọc và dễ bảo trì, đồng thời thể hiện rõ quá trình ra quyết định của chương trình.
Khi dùng các hằng số enum làm trường hợp trong câu lệnh switch, code sẽ tự mô tả ý nghĩa. Thay vì thấy những con số khó hiểu như case 0: hoặc case 5:, bạn sẽ thấy các tên có ý nghĩa, giúp bạn hiểu ngay mục đích của chúng:
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}Cách làm này giúp bạn hiểu và chỉnh sửa code dễ dàng hơn nhiều. Bất kỳ ai đọc code này cũng biết ngay mỗi trường hợp đại diện cho điều gì, đồng thời có thể dễ dàng thêm trường hợp mới hoặc thay đổi logic. Trình biên dịch cũng giúp phát hiện lỗi: nếu bạn viết sai tên một hằng số enum, bạn sẽ gặp lỗi biên dịch thay vì một bug âm thầm.
Thử thách
DễTạo một chương trình C sử dụng enum cùng câu lệnh switch để xây dựng một hệ thống tư vấn thời tiết đơn giản. Chương trình của bạn cần:
- Định nghĩa một
enumcó tênWeatherConditionvới các hằng số sau theo đúng thứ tự:SUNNYCLOUDYRAINYSTORMYSNOWY
- Viết một hàm có tên
getWeatherAdvice:- Nhận một tham số kiểu
enum WeatherConditioncó tênweather - Không trả về giá trị nào (void)
- Sử dụng câu lệnh
switchđể in lời khuyên phù hợp với điều kiện thời tiết:- Với
SUNNY: inPerfect day for outdoor activities! - Với
CLOUDY: inGood day for a walk, no sun protection needed. - Với
RAINY: inDon't forget your umbrella! - Với
STORMY: inStay indoors and avoid travel. - Với
SNOWY: inDrive carefully and dress warmly.
- Với
- Nhận một tham số kiểu
- Viết một hàm có tên
getActivitySuggestion:- Nhận một tham số kiểu
enum WeatherConditioncó tênweather - Không trả về giá trị nào (void)
- Sử dụng câu lệnh
switchđể đề xuất hoạt động dựa trên thời tiết:- Với
SUNNY: inSuggested activity: Beach or hiking - Với
CLOUDY: inSuggested activity: Photography or gardening - Với
RAINY: inSuggested activity: Reading or indoor games - Với
STORMY: inSuggested activity: Movie marathon - Với
SNOWY: inSuggested activity: Skiing or hot cocoa
- Với
- Nhận một tham số kiểu
- Trong hàm main:
- Khai báo một biến kiểu
enum WeatherConditioncó têncurrentWeather - Đọc một số nguyên từ đầu vào, biểu thị điều kiện thời tiết (0, 1, 2, 3 hoặc 4)
- Gán giá trị enum tương ứng cho
currentWeatherdựa trên đầu vào - In điều kiện thời tiết hiện tại theo đúng định dạng này:
Current weather: [numeric_value] - Gọi hàm
getWeatherAdvicevớicurrentWeather - Gọi hàm
getActivitySuggestionvớicurrentWeather
- Khai báo một biến kiểu
Thử thách này minh họa sức mạnh của việc kết hợp enum với câu lệnh switch để tạo ra code dễ đọc và dễ bảo trì. Thay vì dùng các trường hợp số khó hiểu trong câu lệnh switch, bạn sẽ dùng các hằng số enum có ý nghĩa, thể hiện rõ logic của chương trình. Câu lệnh switch trở nên dễ hiểu, giúp bạn nắm được ý nghĩa của từng trường hợp và chỉnh sửa hành vi khi cần.
Tự làm thử
#include <stdio.h>
// TODO: Định nghĩa enum WeatherCondition tại đây
// TODO: Viết hàm getWeatherAdvice tại đây
// TODO: Viết hàm getActivitySuggestion tại đây
int main() {
// Đọc đầu vào
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Khai báo biến currentWeather và gán giá trị enum dựa trên đầu vào
// TODO: In ra điều kiện thời tiết hiện tại theo định dạng "Current weather: [numeric_value]"
// TODO: Gọi hàm getWeatherAdvice
// TODO: Gọi hàm getActivitySuggestion
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