火车预订与取消系统Python代码问题求助:重复座位与取消异常
火车预订与取消系统Python问题解决方案
问题1:多座位预订时出现重复座位号
问题描述
单座位预订功能正常,但多座位预订时偶尔生成重复座位号。需求为多座位预订时先随机选一个起始座位,后续座位按+1分配以保证乘客相邻(如家庭乘客)。
核心原因
- 随机选择起始座位时,未校验连续N个座位是否全部可用,导致选中的起始位后续存在已预订座位
- 分配过程中未做原子化存储,分多次写入文件时可能引发资源竞争,导致重复分配
解决方案(基于OOP与文件IO优化)
- 先校验连续座位可用性
- 从文件读取已预订座位并转为整数集合,利用集合的O(1)查询效率快速判断座位状态
- 随机生成起始座位后,检查该起始位开始的连续N个座位是否都未被预订
- 若不可用则重新随机,直到找到符合条件的连续座位段
- 原子化更新存储
- 确认连续座位可用后,一次性将所有座位号写入文件,避免分批次操作的冲突
class Train: def __init__(self, total_seats): self.total_seats = total_seats self.booked_seats = self._load_booked_seats() def _load_booked_seats(self): # 从文件读取已预订座位,转为整数集合 try: with open('booked_seats.txt', 'r') as f: return set(map(int, f.read().splitlines())) except FileNotFoundError: return set() def _save_booked_seats(self): # 原子化写入已预订座位 with open('booked_seats.txt', 'w') as f: f.write('\n'.join(map(str, sorted(self.booked_seats)))) def book_multiple_seats(self, num_seats): available = self.total_seats - len(self.booked_seats) if num_seats <= 0 or num_seats > available: return None # 参数无效或座位不足 import random while True: # 确保起始座位后有足够的连续座位 start_seat = random.randint(1, self.total_seats - num_seats + 1) required_seats = set(range(start_seat, start_seat + num_seats)) # 检查连续座位是否全部未被预订 if required_seats.isdisjoint(self.booked_seats): self.booked_seats.update(required_seats) self._save_booked_seats() return list(required_seats)
问题2:取消座位时误删包含目标数字的其他座位
问题描述
取消特定座位号(如'1')时,会误删包含该数字的其他座位(如'10'、'11'),需仅删除目标座位号的独立实例。
核心原因
- 处理座位号时使用了字符串包含匹配(如
if target in seat_str),而非精确相等判断 - 文件中存储的座位号未统一类型(如混合字符串与整数),导致匹配逻辑出错
解决方案(精确匹配优化)
- 统一座位号类型:将文件中的座位号全部转为整数,避免字符串模糊匹配
- 精确相等判断:取消时仅删除与目标座位号完全相等的项
class Train: # 继承上述__init__、_load_booked_seats、_save_booked_seats方法 def cancel_seat(self, target_seat): try: # 转为整数确保精确匹配 target = int(target_seat) if target in self.booked_seats: self.booked_seats.remove(target) self._save_booked_seats() return True # 取消成功 return False # 目标座位未被预订 except ValueError: return False # 输入的座位号格式无效
内容的提问来源于stack exchange,提问作者Abhiroop Bhattacharjee
相关产品推荐
相关产品推荐

