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

游乐园骑乘预约系统调度乘客功能循环报错求助

排队预约系统调度问题修复

系统说明

该系统支持乘客预约排队位置,无需现场等待。乘客仅需在程序中输入姓名即可完成预约。购买VIP通行证的乘客可跳过普通乘客,排在队列中最后一位VIP乘客之后,优先登乘(迪士尼乐园骑乘项目平均等待时长约45分钟,该系统实用性较强)。调度时机由员工手动触发,即从队列前端移除下一批乘客。

原代码实现

riders_per_ride = 3  # 每趟可调度的乘客数

line = []  # 乘客队列
num_vips = 0  # 记录队列前端的VIP乘客数量

menu = ('(1) 预约普通排队位置\n'
        '(2) 预约VIP排队位置\n'
        '(3) 调度乘客\n'
        '(4) 查看排队乘客\n'
        '(5) 退出\n')

user_input = input(menu).strip().lower()

while user_input != '5':
    if user_input == '1':  # 添加普通乘客
        name = input('请输入姓名:').strip().lower()
        line.append(name)
        print(f"{name}已加入普通队列")

    elif user_input == '2':  # 添加VIP乘客
        name = input('请输入姓名:').strip().lower()
        # 在最后一位VIP之后插入新VIP
        line.insert(num_vips, name)
        num_vips += 1
        print(f"VIP乘客{name}已加入队列")

    elif user_input == '3':  # 调度乘客
        # 原代码问题:队列长度不足时会报错,且VIP计数未正确更新
        for i in range(riders_per_ride):
            line.pop(0)
        # num_vips -= 1  # 原注释未启用,且逻辑错误

    elif user_input == '4':  # 打印排队乘客
        print(f'{len(line)}人正在排队:', line)

    else:
        print('未知指令,请重新输入')

    user_input = input('请输入指令: ').strip().lower()

问题根源分析

  1. 队列越界错误:当队列中剩余乘客数小于riders_per_ride时,循环执行line.pop(0)会触发IndexError(列表为空或元素不足)。
  2. VIP计数更新错误:原代码中VIP计数更新逻辑被注释,且即使启用,固定减1的逻辑也不符合实际——一次调度可能移除多个VIP乘客,需根据实际移除的VIP数量调整计数。

修复后的代码

riders_per_ride = 3  # 每趟可调度的乘客数

line = []  # 乘客队列
num_vips = 0  # 记录队列前端的VIP乘客数量

menu = ('(1) 预约普通排队位置\n'
        '(2) 预约VIP排队位置\n'
        '(3) 调度乘客\n'
        '(4) 查看排队乘客\n'
        '(5) 退出\n')

user_input = input(menu).strip().lower()

while user_input != '5':
    if user_input == '1':  # 添加普通乘客
        name = input('请输入姓名:').strip().lower()
        line.append(name)
        print(f"{name}已加入普通队列")

    elif user_input == '2':  # 添加VIP乘客
        name = input('请输入姓名:').strip().lower()
        # 在最后一位VIP之后插入新VIP
        line.insert(num_vips, name)
        num_vips += 1
        print(f"VIP乘客{name}已加入队列")

    elif user_input == '3':  # 调度乘客
        # 计算实际可调度的乘客数,避免队列长度不足报错
        dispatch_count = min(riders_per_ride, len(line))
        # 移除对应数量的乘客
        for _ in range(dispatch_count):
            line.pop(0)
        # 更新VIP计数:本次移除的VIP数量为实际调度数与当前VIP数的较小值
        removed_vips = min(dispatch_count, num_vips)
        num_vips -= removed_vips
        print(f"已成功调度{dispatch_count}名乘客,其中包含{removed_vips}名VIP")

    elif user_input == '4':  # 打印排队乘客
        print(f'{len(line)}人正在排队:', line)

    else:
        print('未知指令,请重新输入')

    user_input = input('请输入指令: ').strip().lower()

修复说明

  • 解决越界问题:通过min(riders_per_ride, len(line))获取实际可调度的乘客数,确保不会尝试从空队列或元素不足的队列中移除元素。
  • 修正VIP计数:计算本次调度中移除的VIP数量(即实际调度数和当前VIP数的较小值,因为VIP都在队列前端),并正确更新num_vips。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34