用java编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。 1) 电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。 2) 三个窗口同时出票,出票间隔采用随机控制。 3) 不能重复出售相同的电影票。 程序应具有良好的人机交互性能,即:程序应向用户提示功能说明,并可根据用户的功能选择,执行对应的功能,并给出带详细描述信息的最终执行结果。
时间: 2024-02-13 12:02:42 浏览: 145
java 电影售票系统
5星 · 资源好评率100%
好的,这是一个比较复杂的问题,需要写一个完整的程序。以下是一个简单的Java程序,以满足您的要求:
```java
import java.util.Random;
public class TicketSaleSimulation {
private static final int NUM_TICKETS = 100; // 电影票总数
private static final int NUM_WINDOWS = 3; // 售票窗口数量
private static final int MAX_TICKETS_PER_WINDOW = NUM_TICKETS / NUM_WINDOWS + 1; // 每个窗口售票上限
private static final Random rand = new Random();
private static boolean[] ticketsSold = new boolean[NUM_TICKETS]; // 记录电影票是否已售出
public static void main(String[] args) {
System.out.println("欢迎来到电影院售票系统!");
while (true) {
System.out.println("请选择功能:");
System.out.println("1. 模拟电影票顺序出售");
System.out.println("2. 模拟三个窗口同时出售电影票");
System.out.println("3. 退出程序");
int choice = readIntInput();
if (choice == 1) {
simulateSequentialSale();
} else if (choice == 2) {
simulateConcurrentSale();
} else if (choice == 3) {
System.out.println("感谢使用电影院售票系统!");
break;
} else {
System.out.println("无效的输入,请重新输入!");
}
}
}
private static void simulateSequentialSale() {
System.out.println("开始模拟电影票顺序出售:");
for (int i = 0; i < NUM_TICKETS; i++) {
int windowNum = i % NUM_WINDOWS;
int ticketNum = i + 1;
while (ticketsSold[i]) {
i++;
if (i >= NUM_TICKETS) {
System.out.println("所有电影票已售罄!");
return;
}
windowNum = i % NUM_WINDOWS;
ticketNum = i + 1;
}
System.out.println("窗口" + (windowNum + 1) + "出售编号" + ticketNum + "电影票");
ticketsSold[i] = true;
}
System.out.println("所有电影票已售罄!");
}
private static void simulateConcurrentSale() {
System.out.println("开始模拟三个窗口同时出售电影票:");
int[] ticketsSoldPerWindow = new int[NUM_WINDOWS];
while (true) {
int windowNum = rand.nextInt(NUM_WINDOWS);
if (ticketsSoldPerWindow[windowNum] >= MAX_TICKETS_PER_WINDOW) {
continue;
}
int ticketNum = rand.nextInt(NUM_TICKETS) + 1;
if (ticketsSold[ticketNum - 1]) {
continue;
}
System.out.println("窗口" + (windowNum + 1) + "出售编号" + ticketNum + "电影票");
ticketsSold[ticketNum - 1] = true;
ticketsSoldPerWindow[windowNum]++;
boolean allSoldOut = true;
for (boolean sold : ticketsSold) {
if (!sold) {
allSoldOut = false;
break;
}
}
if (allSoldOut) {
System.out.println("所有电影票已售罄!");
break;
}
try {
Thread.sleep(rand.nextInt(1000) + 500); // 随机等待时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static int readIntInput() {
while (true) {
try {
return Integer.parseInt(System.console().readLine());
} catch (NumberFormatException e) {
System.out.println("无效的输入,请重新输入!");
}
}
}
}
```
该程序的主要思路是:
1. 使用一个布尔数组 `ticketsSold` 来记录电影票是否已售出。初始化时默认所有票未售出。
2. 实现两个模拟售票的方法:`simulateSequentialSale` 和 `simulateConcurrentSale`。
3. 在主方法中,使用一个循环来等待用户输入功能选择。根据用户的选择,调用对应的方法。
4. 实现一个读取用户输入的方法 `readIntInput`,以保证输入的是一个整数。
在 `simulateSequentialSale` 方法中,我们使用一个 for 循环,依次售出每张电影票。每次循环,我们计算当前票应该由哪个窗口售出,并检查该票是否已售出。如果已售出,则跳过该票,继续检查下一张票。如果还有未售出的票,则输出售票信息,并将该票标记为已售出。
在 `simulateConcurrentSale` 方法中,我们使用一个 while 循环,不断随机选择一个窗口和一张未售出的电影票,并检查窗口是否已达到售票上限,以及该票是否已售出。如果窗口已达到售票上限或该票已售出,则跳过该次循环,继续下一轮循环。如果还有未售出的票,则输出售票信息,并将该票标记为已售出。同时,我们还需要记录每个窗口已售出的电影票数量,以便检查窗口是否已达到售票上限。最后,我们在每次售票后随机等待一段时间,模拟售票过程中的间隔。
注意:该程序还有很多可以改进的地方,例如:使用线程来模拟窗口的售票过程,增加更多的错误处理机制等等。
阅读全文