You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言座位可用性查询函数异常问题排查求助

座位可用性查询函数的问题排查与修复

核心问题分析

  1. 无输出提示:check_availability函数仅返回座位号,未按照需求打印座位类型是否可用的提示,导致用户操作后看不到反馈。
  2. 数组误用:函数接收Reservation数组作为参数,但仅需存储用户输入的座位类型,完全可以用局部变量替代,避免不必要的数组访问。
  3. 状态逻辑反转:初始化时将seats[i].available设为false,同时判断可用座位时检查seats[i].available == false,但show_room_status中却把available == true标记为[OCCUPIED],状态定义完全颠倒,正确逻辑应为:available = true表示座位可用,false表示已占用。
  4. 返回值未处理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:45:39