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

如何实现C语言航班座位数组的状态打印与更新?

座位表打印功能实现方案

问题描述

[编辑] 我已经解决了最初的一个问题,原来是if语句的问题,我需要添加一些else if语句,并将判断条件中的5和10改为6和11。
如果有人能提供关于数组部分的帮助——如何打印我的“座位表”,用0表示空座,每次座位被占用时将其改为1,我将不胜感激。

现有代码

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    /*编写一个程序为航空公司唯一航班的每个座位分配座位
     (容量10个座位)。
     显示以下菜单:

            请输入1选择“头等舱”
            请输入2选择“经济舱”

     *1 = 头等舱(座位1-5)。
     *2 = 经济舱(座位6-10)。

      打印显示座位号和舱位的登机牌。

     * 使用一维数组表示座位表。
     * 将数组所有元素初始化为0表示空座,1表示已占用座位

     永远不要分配已被占用的座位。

     当一个舱位已满时,询问乘客是否接受另一个舱位。
     *接受,则进行相应的座位分配。
     *不接受,打印消息“下一班航班3小时后起飞。”*/

    bool taken_seats [10] = {0};
    int first_class = 1;
    int economy_class = 6;
    int class_choice;
    int backup_class_choice;

    do
    {
        printf("\n\n请输入1选择'头等舱'\n"
               "请输入2选择'经济舱'\n"
               "请输入5退出菜单\n\n");
        scanf("%d", &class_choice);

        //头等舱
        if(class_choice == 1 && first_class < 6)
        {
            taken_seats[first_class] = true;
            printf("头等舱机票。\n座位号: %d", first_class);
            first_class++;
        }//end if

        else if(class_choice == 1 && first_class == 6 && economy_class <11)
        {
            printf("抱歉,头等舱座位已售罄。是否愿意选择经济舱座位?" 
                   "\n输入3表示是,4表示否。");
            scanf("%d", &backup_class_choice);
        
           if(backup_class_choice == 3)
           {
               taken_seats[economy_class] = true;
               printf("经济舱机票。\n座位号: ");
               printf("%d\n", economy_class);
               economy_class++;
           }//end if

           else if(backup_class_choice == 4)
           {
               printf("下一班航班3小时后起飞。我们对造成的不便深表歉意。\n再见。\n");
              class_choice = 5; 
           }//end inner else if
        }//end outer else if
        else if(class_choice == 1 && first_class == 6 && economy_class == 11)
        {
            printf("已无可用座位。下一班航班3小时后起飞。我们对造成的不便深表歉意\n");
            class_choice = 5;
        } //end else if


        //经济舱
        if(class_choice == 2 && economy_class < 11)
        {
            taken_seats[economy_class] = true;
            printf("经济舱机票。\n座位号: ");
            printf("%d\n", economy_class);
            economy_class++;
        }//end if

        else if(class_choice == 2 && economy_class == 11 && first_class < 6)
        {
            printf("抱歉,经济舱座位已售罄。是否愿意选择头等舱座位?"
                   "\n输入3表示是,4表示否。\n");
            scanf("%d", &backup_class_choice);
            
            if(backup_class_choice == 3)
            {
               taken_seats[first_class] = true;
               printf("头等舱机票。\n座位号: ");
               printf("%d", first_class);
               first_class++;
             }//end if

           else if(backup_class_choice == 4)
           {
             printf("下一班航班3小时后起飞。我们对造成的不便深表歉意。再见。\n");
           }//end inner else if
        }//end outer else if

        else if(class_choice == 2 && economy_class == 11 && first_class == 6)
        {
            printf("已无经济舱可用座位。下一班航班3小时后起飞。我们对造成的不便深表歉意\n");
            class_choice = 5;
        }//end else if
       


    }//end do
    while(class_choice != 5);

    return 0;
}//end main

关键修正与功能实现

首先要注意一个严重问题:你的数组taken_seats是10个元素,索引范围是0-9,但你直接用座位号1-10作为数组索引,这会导致taken_seats[10]访问越界,触发未定义行为。需要把座位号转换为数组索引:座位号n对应索引n-1。

接下来实现座位表打印功能,我们可以:

  1. 在菜单中添加选项3用于查看座位表
  2. 编写一个循环遍历数组,打印每个座位的状态(0为空,1为已占用),同时标注舱位和座位号

以下是修正后的完整代码:

#include <stdio.h>
#include <stdbool.h>

// 打印座位表的函数
void printSeatTable(bool taken_seats[]) {
    printf("\n=== 航班座位表 ===\n");
    printf("头等舱(座位1-5):\n");
    for (int i = 0; i < 5; i++) {
        printf("座位%d: %d  ", i+1, taken_seats[i]);
    }
    printf("\n经济舱(座位6-10):\n");
    for (int i = 5; i < 10; i++) {
        printf("座位%d: %d  ", i+1, taken_seats[i]);
    }
    printf("\n==================\n");
}

int main(void)
{
    bool taken_seats [10] = {0};
    // 记录头等舱和经济舱下一个可用的座位号
    int first_class_next = 1;
    int economy_class_next = 6;
    int class_choice;
    int backup_class_choice;

    do
    {
        printf("\n\n请输入1选择'头等舱'\n"
               "请输入2选择'经济舱'\n"
               "请输入3查看座位表\n"
               "请输入5退出菜单\n\n");
        scanf("%d", &class_choice);

        // 查看座位表
        if (class_choice == 3) {
            printSeatTable(taken_seats);
            continue;
        }

        //头等舱逻辑
        if(class_choice == 1 && first_class_next < 6)
        {
            // 座位号转索引:first_class_next - 1
            taken_seats[first_class_next - 1] = true;
            printf("头等舱机票。\n座位号: %d\n", first_class_next);
            first_class_next++;
            // 分配后打印座位表,可选
            printSeatTable(taken_seats);
        }
        else if(class_choice == 1 && first_class_next == 6 && economy_class_next <11)
        {
            printf("抱歉,头等舱座位已售罄。是否愿意选择经济舱座位?\n输入3表示是,4表示否。\n");
            scanf("%d", &backup_class_choice);
        
            if(backup_class_choice == 3)
            {
                taken_seats[economy_class_next - 1] = true;
                printf("经济舱机票。\n座位号: %d\n", economy_class_next);
                economy_class_next++;
                printSeatTable(taken_seats);
            }
            else if(backup_class_choice == 4)
            {
                printf("下一班航班3小时后起飞。我们对造成的不便深表歉意。\n再见。\n");
                class_choice = 5; 
            }
        }
        else if(class_choice == 1 && first_class_next == 6 && economy_class_next == 11)
        {
            printf("已无可用座位。下一班航班3小时后起飞。我们对造成的不便深表歉意\n");
            class_choice = 5;
        }

        //经济舱逻辑
        if(class_choice == 2 && economy_class_next < 11)
        {
            taken_seats[economy_class_next - 1] = true;
            printf("经济舱机票。\n座位号: %d\n", economy_class_next);
            economy_class_next++;
            printSeatTable(taken_seats);
        }
        else if(class_choice == 2 && economy_class_next == 11 && first_class_next < 6)
        {
            printf("抱歉,经济舱座位已售罄。是否愿意选择头等舱座位?\n输入3表示是,4表示否。\n");
            scanf("%d", &backup_class_choice);
            
            if(backup_class_choice == 3)
            {
                taken_seats[first_class_next - 1] = true;
                printf("头等舱机票。\n座位号: %d\n", first_class_next);
                first_class_next++;
                printSeatTable(taken_seats);
            }
            else if(backup_class_choice == 4)
            {
                printf("下一班航班3小时后起飞。我们对造成的不便深表歉意。再见。\n");
                class_choice = 5;
            }
        }
        else if(class_choice == 2 && economy_class_next == 11 && first_class_next == 6)
        {
            printf("已无可用座位。下一班航班3小时后起飞。我们对造成的不便深表歉意\n");
            class_choice = 5;
        }

    } while(class_choice != 5);

    return 0;
}

说明

  • 新增了printSeatTable函数专门负责打印座位表,清晰区分头等舱和经济舱
  • 修正了数组索引越界问题,将座位号转换为座位号-1作为数组索引
  • 在菜单中添加了选项3,用户可随时查看座位状态
  • 每次分配座位后自动打印座位表,方便直观看到座位变化

内容的提问来源于stack exchange,提问作者Silver2L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:55:18