Java影院预订系统如何在二维矩阵中保存并展示多个已预订座位
影院座位预订管理程序修复方案
问题原因
你当前的代码只声明了chosenRow和chosenColumn两个单个变量存储最新一次的预订座位,每次新的预订都会覆盖掉上一次的取值,所以展示座位时只能看到最新一次的预订记录,历史记录全部丢失。
需要新增/修改的逻辑
- 新增二维数组存储所有座位的预订状态:在获取到影院的行数和列数之后,初始化一个二维数组用来记录每一个座位的预订状态,默认所有座位都是空闲状态。
- 购票成功后更新数组状态:用户输入要预订的座位后,先校验座位是否合法、是否已经被预订,校验通过后将二维数组中对应位置的状态修改为已预订。
- 调整座位展示逻辑:展示座位时直接遍历二维数组,根据数组中存储的状态输出
S(空闲)或者B(已预订),替换原来仅比对最新一次预订座位的判断逻辑。 - 可选优化:新增重复预订校验,避免同一个座位被多次售卖。
修改后的完整代码
import java.util.Scanner; public class Cinema { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 价格配置 int priceLessThan60pax = 10; int priceFirstHalf = 10; int priceSecondHalf = 8; // 输入影院尺寸 System.out.println("Enter the number of rows:"); int row = scanner.nextInt(); System.out.println("Enter the number of seats in each row"); int column = scanner.nextInt(); System.out.println(); int numberOfSeats = row * column; // 新增:二维数组存储座位状态,false代表空闲,true代表已预订 boolean[][] seatStatus = new boolean[row + 1][column + 1]; // 菜单循环 while (true) { System.out.println("1: Show the seats"); System.out.println("2. Buy a ticket"); System.out.println("0. Exit"); int menuSelection = scanner.nextInt(); switch (menuSelection) { case 1: System.out.println(); System.out.println("Cinema:"); // 打印表头 System.out.print(" "); for (int i = 1; i <= column; i++) { System.out.print(i + " "); } System.out.println(); // 修改:遍历二维数组输出座位状态 for (int i = 1; i <= row; i++) { System.out.print(i + " "); for (int j = 1; j <= column ; j++) { if (seatStatus[i][j]) { System.out.print("B "); } else { System.out.print("S "); } } System.out.println(); } System.out.println(); break; case 2: System.out.println(); int chosenRow, chosenColumn; // 输入加校验,避免非法输入和重复预订 while (true) { System.out.println("Enter a row number:"); chosenRow = scanner.nextInt(); System.out.println("Enter a seat number in that row:"); chosenColumn = scanner.nextInt(); // 校验座位合法性 if (chosenRow < 1 || chosenRow > row || chosenColumn < 1 || chosenColumn > column) { System.out.println("Wrong input! Please enter valid seat number."); continue; } // 校验是否已预订 if (seatStatus[chosenRow][chosenColumn]) { System.out.println("That ticket has already been purchased! Please choose another seat."); continue; } break; } // 计算票价 if (numberOfSeats > 60) { if (chosenRow <= (row / 2)) { System.out.println("Ticket Price: $" + priceFirstHalf); } else { System.out.println("Ticket Price: $" + priceSecondHalf); } } else { System.out.println("Ticket Price: $" + priceLessThan60pax); } // 新增:更新座位状态为已预订 seatStatus[chosenRow][chosenColumn] = true; System.out.println(); break; default: scanner.close(); return; } } } }
内容的提问来源于stack exchange,提问作者MightyBeef
相关产品推荐
相关产品推荐

