enum枚举
定义枚举类型
常用 -- 别名
// 定义一个别名为 OrderStatus 的枚举类型,表示订单的不同状态
typedef enum {
NEW, // 新订单
PAID, // 已支付
SHIPPED, // 已发货
DELIVERED, // 已送达
COMPLETED, // 已完成
CANCELLED // 已取消
} OrderStatus;
int main(void) {
// 声明一个枚举类型变量,此时可以省略enum关键字
OrderStatus status;
return 0;
}
// 定义一个名为 order_status 的枚举类型,表示订单的不同状态 enum order_status { NEW, // 新订单 PAID, // 已支付 SHIPPED, // 已发货 DELIVERED, // 已送达 COMPLETED, // 已完成 CANCELLED // 已取消 }; int main(void) { // 声明一个枚举类型变量 enum order_status status; return 0; }
初始化枚举类型变量
定义枚举类型后,你可以声明该枚举类型的变量,并将预定义的枚举值赋给它:
OrderStatus status = NEW;
枚举类型的成员本质上就是一个整数,所以它们在内存中都是对应整数值。
在定义枚举类型时,若不主动给枚举成员赋值,那么这些成员的取值将从0开始,向后逐一累加。比如上面的枚举类型OrderStatus:
NEW = 0
PAID = 1
SHIPPED = 2
...
也可以在定义枚举类型时,给成员手动赋值**(但没必要这么做)**:
typedef enum {
NEW = 888,
PAID, // 自动累加 889
SHIPPED, // 890
DELIVERED,
COMPLETED,
CANCELLED
} OrderStatus;
例题
例题一
定义一个枚举类型Month,包含一年中12个月份的英文单词。并从一月份开始,为枚举成员分配一个从1开始的数字值。
例如:January=1,February=2,依此类推…
编写一个函数,接收Month类型的参数,返回该月份有多少天。
注意:不考虑平年闰年,2月份一律输出28天。
提示:可以用switch对枚举类型进行选择。
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 定义枚举类型Month
typedef enum {
January = 1, // 手动设置为1,否则默认从0开始设置值
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
} Month;
// 定义函数,根据Month枚举返回该月的天数
int days_in_month(Month month) {
switch (month) {
case January:
case March:
case May:
case July:
case August:
case October:
case December:
return 31;
case April:
case June:
case September:
case November:
return 30;
case February:
return 28;
default:
// 错误处理
return -1;
}
}
int main(void) {
Month month = February;
printf("Days in February: %d\n", days_in_month(month));
month = April;
printf("Days in April: %d\n", days_in_month(month));
return 0;
}
例题二
编写一个程序,管理图书馆中的书籍信息。每本书籍的信息包含以下内容:
- 书籍编号(整型)
- 书籍名称(字符串)
- 书籍作者(字符串)
- 书籍类别(枚举类型)
请定义一个Book书籍结构体类型来存储一本书的信息,以及Genre这个书籍类别枚举类型。
书籍类别的枚举类型包含以下类别:
- 科幻(SCIENCE_FICTION)
- 文学(LITERATURE)
- 历史(HISTORY)
- 科技(TECHNOLOGY)
- 其他(OTHER)
现在给定你一个Book结构体对象数组的数据,一共十本书:
#define MAX_BOOKS 10
Book books[MAX_BOOKS] = {
{1, "三体", "刘慈欣", SCIENCE_FICTION},
{2, "红楼梦", "曹雪芹", LITERATURE},
{3, "中国通史", "吕思勉", HISTORY},
{4, "时间简史", "史蒂芬·霍金", TECHNOLOGY},
{5, "围城", "钱钟书", LITERATURE},
{6, "傲慢与偏见", "简·奥斯汀", LITERATURE},
{7, "呼啸山庄", "艾米莉·勃朗特", LITERATURE},
{8, "活着", "余华", LITERATURE},
{9, "明朝那些事儿", "当年明月", HISTORY},
{10, "乌合之众", "古斯塔夫·勒庞", OTHER}
};
请实现以下功能:
- 程序启动,即打印所有书籍的信息。
- 根据用户输入的书籍类别编号,查找并输出该类别的所有书籍信息。
程序的运行结果如下图所示:
提示,建议提取下列三个函数来实现整个程序的功能:
void print_book_info(Book *books, int count); // 打印所有书籍信息
void find_books_by_genre(Book *books, int count, Genre genre); // 根据书籍类别打印书籍
char *get_genre_name(Genre genre); // 将书籍类别的枚举值转换成中文表示的类别
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX_BOOKS 10
#define TITLE_LENGTH 100
#define AUTHOR_LENGTH 50
// 定义书籍类别的枚举类型
typedef enum {
SCIENCE_FICTION, // 科幻
LITERATURE, // 文学
HISTORY, // 历史
TECHNOLOGY, // 科技
OTHER // 其他
} Genre;
// 定义书籍结构体类型
typedef struct {
int id;
char title[TITLE_LENGTH];
char author[AUTHOR_LENGTH];
Genre genre;
} Book;
void print_book_info(Book *books, int count); // 打印所有书籍信息
void find_books_by_genre(Book *books, int count, Genre genre); // 根据书籍类别打印书籍
char *get_genre_name(Genre genre); // 将书籍类别的枚举值转换成中文表示的类别
int main() {
Book books[MAX_BOOKS] = {
{1, "三体", "刘慈欣", SCIENCE_FICTION},
{2, "红楼梦", "曹雪芹", LITERATURE},
{3, "中国通史", "吕思勉", HISTORY},
{4, "时间简史", "史蒂芬·霍金", TECHNOLOGY},
{5, "围城", "钱钟书", LITERATURE},
{6, "傲慢与偏见", "简·奥斯汀", LITERATURE},
{7, "呼啸山庄", "艾米莉·勃朗特", LITERATURE},
{8, "活着", "余华", LITERATURE},
{9, "明朝那些事儿", "当年明月", HISTORY},
{10, "乌合之众", "古斯塔夫·勒庞", OTHER}
};
int count = MAX_BOOKS;
// 打印所有书籍的信息
print_book_info(books, count);
// 用户输入书籍类别编号并查找该类别的书籍
int genre;
printf("请输入书籍类别编号 (0: 科幻, 1: 文学, 2: 历史, 3: 科技, 4: 其他)来查询书籍: ");
scanf("%d", &genre);
find_books_by_genre(books, count, (Genre)genre);
return 0;
}
// 打印所有书籍的信息
void print_book_info(Book *books, int count) {
printf("---------------所有的书籍信息---------------\n\n");
for (int i = 0; i < count; i++) {
printf("编号: %d, 书名: %s, 作者: %s, 类别: %s\n",
books[i].id, books[i].title, books[i].author, get_genre_name(books[i].genre));
}
printf("\n");
}
// 根据书籍类别查找并打印该类别的所有书籍信息
void find_books_by_genre(Book *books, int count, Genre genre) {
printf("类别为 %s 的书籍有:\n", get_genre_name(genre));
for (int i = 0; i < count; i++) {
if (books[i].genre == genre) {
printf("编号: %d, 书名: %s, 作者: %s\n",
books[i].id, books[i].title, books[i].author);
}
}
}
// 将书籍类别的枚举值转换成中文表示的类别
const char *get_genre_name(Genre genre) {
switch (genre) {
case SCIENCE_FICTION: return "科幻";
case LITERATURE: return "文学";
case HISTORY: return "历史";
case TECHNOLOGY: return "科技";
case OTHER: return "其他";
default: return "未知";
}
}