enum枚举

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;
}

例题二

编写一个程序,管理图书馆中的书籍信息。每本书籍的信息包含以下内容:

  1. 书籍编号(整型)
  2. 书籍名称(字符串)
  3. 书籍作者(字符串)
  4. 书籍类别(枚举类型)

请定义一个Book书籍结构体类型来存储一本书的信息,以及Genre这个书籍类别枚举类型

书籍类别的枚举类型包含以下类别:

  1. 科幻(SCIENCE_FICTION)
  2. 文学(LITERATURE)
  3. 历史(HISTORY)
  4. 科技(TECHNOLOGY)
  5. 其他(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}
};

请实现以下功能:

  1. 程序启动,即打印所有书籍的信息。
  2. 根据用户输入的书籍类别编号,查找并输出该类别的所有书籍信息。

程序的运行结果如下图所示:

在这里插入图片描述

提示,建议提取下列三个函数来实现整个程序的功能:

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 "未知";
    }
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值