C语言座位可用性查询函数异常问题排查求助
座位可用性查询函数的问题排查与修复
核心问题分析
- 无输出提示:
check_availability函数仅返回座位号,未按照需求打印座位类型是否可用的提示,导致用户操作后看不到反馈。 - 数组误用:函数接收
Reservation数组作为参数,但仅需存储用户输入的座位类型,完全可以用局部变量替代,避免不必要的数组访问。 - 状态逻辑反转:初始化时将
seats[i].available设为false,同时判断可用座位时检查seats[i].available == false,但show_room_status中却把available == true标记为[OCCUPIED],状态定义完全颠倒,正确逻辑应为:available = true表示座位可用,false表示已占用。 - 返回值未处理:
main函数调用check_availability后,未接收并展示返回的座位号,导致结果无法呈现给用户。
修复后的完整代码
#include <stdio.h> #include <stdbool.h> #define MAX_SEATS 20 #define FIRST_STALL 0 #define LAST_STALL 9 #define FIRST_BALCONY 10 #define LAST_BALCONY 14 #define FIRST_GALLERY 15 #define LAST_GALLERY 19 typedef enum { STALL, BALCONY, GALLERY } SeatingType; char type[3][20] = {"Stall", "Balcony", "Gallery"}; typedef struct { char name[50]; char surname[50]; char email[20]; int seat_number; SeatingType seat_type; } Reservation; typedef struct { bool available; } Seats; void show_room_status(Seats seats[MAX_SEATS]) { for(int i = FIRST_STALL; i <= LAST_STALL; i++) { if(seats[i].available == false) { printf("%d. Stall: [OCCUPIED]\n", i + 1); } else { printf("%d. Stall: [AVAILABLE]\n", i + 1); } } for(int i = FIRST_BALCONY; i <= LAST_BALCONY; i++) { if(seats[i].available == false) { printf("%d. Balcony: [OCCUPIED]\n", i + 1); } else { printf("%d. Balcony: [AVAILABLE]\n", i + 1); } } for(int i = FIRST_GALLERY; i <= LAST_GALLERY; i++) { if(seats[i].available == false) { printf("%d. Gallery: [OCCUPIED]\n", i + 1); } else { printf("%d. Gallery: [AVAILABLE]\n", i + 1); } } } int check_availability(Seats seats[MAX_SEATS]) { int seat_type; do { printf("Enter seating type to reserve\n(0=Stall 1=Balcony 2=Gallery): "); scanf("%d", &seat_type); } while(seat_type > 2 || seat_type < 0); int first_available = -1; // 根据座位类型查找第一个可用座位 switch (seat_type) { case STALL: for(int i = FIRST_STALL; i <= LAST_STALL; i++) { if(seats[i].available == true) { first_available = i + 1; break; } } break; case BALCONY: for(int i = FIRST_BALCONY; i <= LAST_BALCONY; i++) { if(seats[i].available == true) { first_available = i + 1; break; } } break; case GALLERY: for(int i = FIRST_GALLERY; i <= LAST_GALLERY; i++) { if(seats[i].available == true) { first_available = i + 1; break; } } break; } // 打印提示信息 if(first_available != -1) { printf("%s座位可用,第一个可用座位号:%d\n", type[seat_type], first_available); } else { printf("%s座位已全部被占用,无可用座位\n", type[seat_type]); } return first_available; } int main() { Reservation reservation[MAX_SEATS]; Seats seats[MAX_SEATS]; // 初始化所有座位为可用状态(available = true) for(int i = 0; i < MAX_SEATS; i++) { seats[i].available = true; } int choice; do { printf("\n---------------\n"); printf("1. Show Room Status\n"); printf("2. Check Availability\n"); printf("0. Exit\n"); scanf("%d", &choice); switch (choice) { case 1: show_room_status(seats); break; case 2: check_availability(seats); break; case 0: printf("Goodbye!\n"); break; default: printf("Invalid Choice!\n"); break; } } while(choice != 0); return 0; }
关键修改说明
- 调整
check_availability函数参数,去掉不必要的Reservation数组,改用局部变量seat_type存储用户输入。 - 修正座位状态逻辑:初始化时将
available设为true表示可用,判断逻辑同步调整。 - 在
check_availability中添加打印逻辑,根据查询结果输出对应提示。 - 修复循环查找逻辑:找到第一个可用座位后立即
break,避免遍历全部座位。
内容的提问来源于stack exchange,提问作者Binky
相关产品推荐
相关产品推荐

