如何实现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。
接下来实现座位表打印功能,我们可以:
- 在菜单中添加选项
3用于查看座位表 - 编写一个循环遍历数组,打印每个座位的状态(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
相关产品推荐
相关产品推荐

