|
发表于 2024-9-19 19:35:59
|
显示全部楼层
好的,鱼油,我们来看一下嵌套枚举类型定义的具体含义及其作用。
### 枚举类型 `MenuOption`
- typedef enum {
- SHOW_EMPTY_SEATS = 1,
- SHOW_BOOKED_SEATS,
- BOOK_SEAT,
- CANCEL_SEAT,
- EXIT
- } MenuOption;
复制代码
### 作用及解释
1. **定义菜单选项枚举类型:**
`typedef enum { ... } MenuOption;` 是在定义一个枚举类型 `MenuOption`,它包含了一组命名的整数常量。通过使用枚举,我们可以让代码更具可读性。这样我们在处理菜单选项时可以使用这些命名常量,而不仅仅是数字。
2. **枚举值及其意义:**
- `SHOW_EMPTY_SEATS = 1` 的值为1,表示显示所有未被分配的空座位编号。
- `SHOW_BOOKED_SEATS` 的值为2(默认从上一个值递增),表示显示已经卖出去的座位编号,并能知道乘客姓名以及性别。
- `BOOK_SEAT` 的值为3,表示买票。
- `CANCEL_SEAT` 的值为4,表示退票。
- `EXIT` 的值为5,表示退出系统。
这样,通过枚举类型不仅可以便于理解和维护代码,还可以防止在代码中直接使用“魔法数字”(magic numbers),提高了代码的可读性和可维护性。
### 代码实现
下面我们将上述结构体定义和枚举类型定义放到程序中,并为每个功能编写函数:
- #include <stdio.h>
- #include <string.h>
- #define TOTAL_SEATS 12
- typedef struct {
- int seatNumber;
- int isBooked;
- char name[50];
- char gender;
- } Seat;
- typedef enum {
- SHOW_EMPTY_SEATS = 1,
- SHOW_BOOKED_SEATS,
- BOOK_SEAT,
- CANCEL_SEAT,
- EXIT
- } MenuOption;
- void showEmptySeats(Seat seats[], int size) {
- printf("Empty seats: ");
- for (int i = 0; i < size; i++) {
- if (!seats[i].isBooked) {
- printf("%d ", seats[i].seatNumber);
- }
- }
- printf("\n");
- }
- void showBookedSeats(Seat seats[], int size) {
- printf("Booked seats:\n");
- for (int i = 0; i < size; i++) {
- if (seats[i].isBooked) {
- printf("Seat %d: Name: %s, Gender: %c\n", seats[i].seatNumber, seats[i].name, seats[i].gender);
- }
- }
- }
- void bookSeat(Seat seats[], int size) {
- int seatNumber;
- printf("Enter seat number to book: ");
- scanf("%d", &seatNumber);
- if (seatNumber < 1 || seatNumber > size || seats[seatNumber - 1].isBooked) {
- printf("Seat not available or already booked.\n");
- } else {
- printf("Enter your name: ");
- scanf("%s", seats[seatNumber - 1].name);
- printf("Enter your gender (M/F): ");
- scanf(" %c", &seats[seatNumber - 1].gender);
- seats[seatNumber - 1].isBooked = 1;
- printf("Seat %d booked successfully.\n", seatNumber);
- }
- }
- void cancelSeat(Seat seats[], int size) {
- int seatNumber;
- printf("Enter seat number to cancel: ");
- scanf("%d", &seatNumber);
- if (seatNumber < 1 || seatNumber > size || !seats[seatNumber - 1].isBooked) {
- printf("Seat not booked or invalid seat number.\n");
- } else {
- seats[seatNumber - 1].isBooked = 0;
- strcpy(seats[seatNumber - 1].name, "");
- seats[seatNumber - 1].gender = '\0';
- printf("Seat %d cancelled successfully.\n", seatNumber);
- }
- }
- int main() {
- Seat seats[TOTAL_SEATS];
- for (int i = 0; i < TOTAL_SEATS; i++) {
- seats[i].seatNumber = i + 1;
- seats[i].isBooked = 0;
- strcpy(seats[i].name, "");
- seats[i].gender = '\0';
- }
- while (1) {
- printf("Menu:\n");
- printf("1: Show empty seats\n");
- printf("2: Show booked seats\n");
- printf("3: Book a seat\n");
- printf("4: Cancel a booking\n");
- printf("5: Exit\n");
- printf("Enter an option: ");
- int option;
- scanf("%d", &option);
- switch (option) {
- case SHOW_EMPTY_SEATS:
- showEmptySeats(seats, TOTAL_SEATS);
- break;
- case SHOW_BOOKED_SEATS:
- showBookedSeats(seats, TOTAL_SEATS);
- break;
- case BOOK_SEAT:
- bookSeat(seats, TOTAL_SEATS);
- break;
- case CANCEL_SEAT:
- cancelSeat(seats, TOTAL_SEATS);
- break;
- case EXIT:
- return 0;
- default:
- printf("Invalid option, try again.\n");
- }
- }
- return 0;
- }
复制代码
### 解释
1. **结构体 `Seat`:** 存储座位信息,包括座位编号、是否已预订、乘客姓名和性别。
2. **枚举类型 `MenuOption`:** 定义菜单选项使代码更具可读性。
3. **函数实现:**
- `showEmptySeats`:显示所有未被预订的座位编号。
- `showBookedSeats`:显示所有已预订的座位编号及乘客信息。
- `bookSeat`:预订座位,如果座位已被预订或无效座位编号,则提示错误信息。
- `cancelSeat`:取消预订,返还该座位的相关信息。
4. **主函数 `main`:** 初始化座位信息,显示菜单并根据用户输入调用不同的功能函数。
通过这种方式,程序更加模块化和可读,用户也能更方便地操作。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|