游乐园骑乘预约系统调度乘客功能循环报错求助
排队预约系统调度问题修复
系统说明
该系统支持乘客预约排队位置,无需现场等待。乘客仅需在程序中输入姓名即可完成预约。购买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()
问题根源分析
- 队列越界错误:当队列中剩余乘客数小于
riders_per_ride时,循环执行line.pop(0)会触发IndexError(列表为空或元素不足)。 - 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
相关产品推荐
相关产品推荐

