from IPython.core.display import display_pretty # type: ignore
import os
class Trains:
def __init__(self, name, id, trains, origin, arrival, seat, time1, time2):
#初始化乘客信息类
self.name = name#乘客姓名
self.id = id#乘客身份证号
self.trains = trains#车次编号
self.origin = origin#出发站
self.arrival = arrival#到达站
self.seat = seat#座位号
self.time1 = time1#出发时间
self.time2 = time2#到达时间
def __str__(self):
#定义打印乘客信息的格式
return (f" 乘客身份证:{self.id}\n "
f"乘客姓名:{self.name}\n "
f"车次:{self.trains}\n "
f"车次起始点:{self.origin}\n "
f"车次终点:{self.arrival}\n "
f"乘客的座位号:{self.seat}\n "
f"车次的起始时间:{self.time1}\n "
f"车次的到达时间:{self.time2}\n")
class Manager:
def __init__(self, data_path="./data.txt", trains_path="./trains.txt", seats_path="./seats.txt"):
#初始化管理器类,定义文件路径好数据结构
self.trains = [] # 乘客信息列表
self.data_path = data_path # 乘客信息文件路径
self.trains_path = trains_path # 车次信息文件路径
self.seats_path = seats_path # 座位信息文件路径
self.ticket_info = {} # 车次信息字典
self.seat_map = {} # 座位映射字典 {车次: 座位图}
self.load_data() # 加载乘客信息
self.load_trains_data() # 加载车次信息
self.load_seats_data() # 加载座位信息
def load_data(self):
"""加载乘客信息"""
try:
if os.path.exists(self.data_path): #检查文件是否存在
with open(self.data_path, 'r', encoding="utf-8") as f:
for line in f.readlines():
line = line.strip("\n")
if not line: # 跳过空行
continue
datas = line.split(" ")
# 修正数据解析,确保正确分配到各个字段
#创建乘客对象并加入列表
train = Trains(
name=datas[1],
id=int(datas[0]),
trains=datas[2],
origin=datas[3],
arrival=datas[4],
seat=datas[5],
time1=datas[6],
time2=datas[7]
)
self.trains.append(train)
print(f"已加载 {len(self.trains)} 条乘客信息")
else:
print(f"数据文件 {self.data_path} 不存在,将在保存时创建")
except Exception as e:
print(f"加载乘客数据出错: {e}")
def save_data(self):
"""保存乘客信息"""
try:
with open(self.data_path, 'w', encoding="utf-8") as f:
passenger_records = []
for passenger in self.trains:
# 修正数据保存格式,确保各字段之间有空格
#见乘客信息转换为字符串并保存到文件
passenger_records.append(
f"{passenger.id} {passenger.name} {passenger.trains} {passenger.origin} "
f"{passenger.arrival} {passenger.seat} {passenger.time1} {passenger.time2}\n"
)
f.writelines(passenger_records)
print(f"已保存 {len(self.trains)} 条乘客信息")
except Exception as e:
print(f"保存乘客数据出错: {e}")
def load_trains_data(self):
"""加载车次信息"""
try:
if os.path.exists(self.trains_path): #检查文件是否存在
with open(self.trains_path, 'r', encoding="utf-8") as f:
for line in f.readlines():
line = line.strip()
if not line: # 跳过空行
continue
parts = line.split(',')
if len(parts) >= 5:
train_id = parts[0]#车次编号
route = parts[1]#路线
departure = parts[2]#出发时间
arrival = parts[3]#到达时间
duration = parts[4]#历时
self.ticket_info[train_id] = [route, departure, arrival, duration]
print(f"已加载 {len(self.ticket_info)} 条车次信息")
else:
# 如果文件不存在,创建默认车次信息
self.ticket_info = {
'G1569': ['北京南-天津南', '18:06', '18:39', '00:33'],
'G1570': ['北京南-天津东', '18:08', '18:39', '00:31'],
'G1572': ['北京南-天津西', '18:09', '18:49', '00:40'],
'G1576': ['北京南-天津北', '18:11', '18:41', '00:30']
}
self.save_trains_data() # 保存默认车次信息
print(f"已创建默认车次信息文件 {self.trains_path}")
except Exception as e:
print(f"加载车次数据出错: {e}")
def save_trains_data(self):
"""保存车次信息"""
try:
with open(self.trains_path, 'w', encoding="utf-8") as f:
for train_id, info in self.ticket_info.items():
# 格式: 车次编号,线路,发车时间,到达时间,历时
line = f"{train_id},{info[0]},{info[1]},{info[2]},{info[3]}\n"
f.write(line)
print(f"已保存 {len(self.ticket_info)} 条车次信息")
except Exception as e:
print(f"保存车次数据出错: {e}")
def load_seats_data(self):
"""加载座位信息"""
try:
if os.path.exists(self.seats_path): #检查文件是否存在
with open(self.seats_path, 'r', encoding="utf-8") as f:
for line in f.readlines():
line = line.strip()
if not line: # 跳过空行
continue
parts = line.split(':')
if len(parts) == 2:
train_id = parts[0] #车次编号
seats = parts[1].split(';')
# 将座位字符串转换为二维列表
seat_map = []
for row in seats:
seat_map.append(list(row))
self.seat_map[train_id] = seat_map
print(f"已加载 {len(self.seat_map)} 条车次的座位信息")
else:
# 如果文件不存在,为每个车次创建默认座位图
for train_id in self.ticket_info:
# 创建50个座位的座位图 (10行x5列)
self.seat_map[train_id] = [['*' for _ in range(5)] for _ in range(10)]
self.save_seats_data() # 保存座位信息
print(f"已创建默认座位信息文件 {self.seats_path}")
except Exception as e:
print(f"加载座位数据出错: {e}")
def save_seats_data(self):
"""保存座位信息"""
try:
with open(self.seats_path, 'w', encoding="utf-8") as f:
for train_id, seat_map in self.seat_map.items():
# 将座位图转换为字符串表示
seat_str = ':'.join([train_id, ';'.join([''.join(row) for row in seat_map])])
f.write(seat_str + '\n')
print(f"已保存 {len(self.seat_map)} 条车次的座位信息")
except Exception as e:
print(f"保存座位数据出错: {e}")
def menu(self):
print("\n--- 乘客信息管理 ---")
print("1.添加乘客信息")
print("2.删除乘客信息")
print("3.更新乘客信息")
print("4.查找乘客信息")
print("5.显示所有乘客信息")
print("6.退出")
def auto_save(self):
'''自动保存所有数据'''
try:
self.save_data()
self.save_trains_data()
self.save_seats_data()
except Exception as e:
print(f"自动保存失败:{e}")
def show(self):
if not self.trains:
print("暂无乘客信息")
return
for s in self.trains:
print(s)
def add(self):
while True:
try:
id = int(input("请输入乘客身份证:"))
# 检查身份证是否已存在
if any(train.id == id for train in self.trains):
print("该身份证已存在")
return
break
except ValueError:
print("身份证格式错误,请输入数字")
name = input("请输入乘客姓名:")
trains = input("请输入车次:")
origin = input("请输入起始点:")
arrival = input("请输入到达点:")
seat = input("请输入座位号:")
time1 = input("请输入车次起始时间:")
time2 = input("请输入车次到达时间:")
self.trains.append(
Trains(name, id, str(trains), str(origin), str(arrival), str(seat), str(time1), str(time2)))
print("添加成功:")
self.show()
self.auto_save()
def delete(self):
'''删除用户信息'''
try:
id = int(input("请输入乘客身份证:"))
found = False
for index, train in enumerate(self.trains):
if train.id == id:
# 释放座位
if train.seat != "待分配" and train.trains in self.seat_map:
seat = train.seat
row = ord(seat[0]) - ord('A')
col = int(seat[1:]) - 1
if 0 <= row < len(self.seat_map[train.trains]) and 0 <= col < 5:
self.seat_map[train.trains][row][col] = '*' # 标记为可用
print(f"已释放座位 {seat}")
del self.trains[index]
found = True
print("删除成功")
self.save_seats_data()
break
if not found:
print("未找到该乘客信息")
self.show()
self.auto_save()
except ValueError:
print("身份证格式错误,请输入数字")
def update(self):
try:
train_id = input("请输入需要更新的乘客身份证:")
train_id = int(train_id)
for index, train in enumerate(self.trains):
if train.id == train_id:
# 输入需要更新的信息
new_name = input(f"当前姓名: {train.name},请输入新姓名(直接回车跳过): ") or train.name
new_origin = input(f"当前起始点: {train.origin},请输入新起始点(直接回车跳过): ") or train.origin
new_arrival = input(f"当前到达点: {train.arrival},请输入新到达点(直接回车跳过): ") or train.arrival
# 座位更新需要特殊处理
new_seat = input(f"当前座位号: {train.seat},请输入新座位号(直接回车跳过): ")
if new_seat:
# 释放原座位
if train.seat != "待分配" and train.trains in self.seat_map:
seat = train.seat
row = ord(seat[0]) - ord('A')
col = int(seat[1:]) - 1
if 0 <= row < len(self.seat_map[train.trains]) and 0 <= col < 5:
self.seat_map[train.trains][row][col] = '*' # 标记为可用
print(f"已释放原座位 {seat}")
# 分配新座位
train.seat = new_seat
if train.trains in self.seat_map:
row = ord(new_seat[0]) - ord('A')
col = int(new_seat[1:]) - 1
if 0 <= row < len(self.seat_map[train.trains]) and 0 <= col < 5:
if self.seat_map[train.trains][row][col] == '*':
self.seat_map[train.trains][row][col] = '#' # 标记为已预订
print(f"已分配新座位 {new_seat}")
else:
print(f"座位 {new_seat} 不可用或已被预订")
else:
new_seat = train.seat
new_time1 = input(
f"当前车次起始时间: {train.time1},请输入新车次起始时间(直接回车跳过): ") or train.time1
new_time2 = input(
f"当前车次终点时间: {train.time2},请输入新车次终点时间(直接回车跳过): ") or train.time2
# 更新字段
self.trains[index].name = new_name
self.trains[index].origin = new_origin
self.trains[index].arrival = new_arrival
self.trains[index].seat = new_seat
self.trains[index].time1 = new_time1
self.trains[index].time2 = new_time2
print("更新成功:")
self.show()
self.save_seats_data()
self.auto_save()
return
print("未找到该乘客信息")
except ValueError:
print("身份证格式错误,请输入数字")
def find(self):
'''查找乘客信息'''
try:
id = int(input("请输入要查找的乘客身份证:"))
for s in self.trains:
if s.id == id:
print(s)
return
print("没有找到这个乘客的相关信息")
except ValueError:
print("身份证格式错误,请输入数字")
def get_seat_map(self, train_id):
"""获取指定车次的座位图"""
if train_id in self.seat_map:
return self.seat_map[train_id]
else:
# 如果车次没有座位图,创建一个
self.seat_map[train_id] = [['*' for _ in range(5)] for _ in range(10)]
return self.seat_map[train_id]
def passenger_info_management(manager):
'''乘客信息管理主函数'''
while True:
manager.menu()
op = input("请选择:")
if op == '1':
manager.add()
elif op == '2':
manager.delete()
elif op == '3':
manager.update()
elif op == '4':
manager.find()
elif op == '5':
manager.show()
elif op == '6':
manager.save_data()
break
else:
print("无效选择,请重新输入!")
'''==============车次管理系统=============='''
def train_management(manager):
"""显示菜单"""
while True:
print("\n=== 车次管理系统 ===")
print("1. 添加车次")
print("2. 删除车次")
print("3. 修改车次")
print("4. 查询车次")
print("0. 返回主菜单")
print("=================")
choice = input("请选择操作:")
if choice == '1':
add_train(manager)
elif choice == '2':
delete_train(manager)
elif choice == '3':
modify_train(manager)
elif choice == '4':
query_train(manager)
elif choice == '0':
print("返回主菜单")
break
else:
print("无效的选择,请重新输入!")
"""添加车次"""
def add_train(manager):
while True:
train_id = input("请输入车次编号(格式:Gxxxx):")
if not train_id.startswith("G") or not train_id[1:].isdigit():
print("车次编号格式错误,请重新输入!")
continue
if train_id in manager.ticket_info:
print(f"车次 {train_id} 已存在,请勿重复添加!")
continue
break
route = input("请输入线路(格式:起点-终点):")
departure_time = input("请输入出发时间(HH:MM 格式):")
arrival_time = input("请输入到达时间(HH:MM 格式):")
duration = input("请输入历时(HH:MM 格式):")
manager.ticket_info[train_id] = [route, departure_time, arrival_time, duration]
# 为新列车添加座位图
manager.seat_map[train_id] = [['*' for _ in range(5)] for _ in range(10)]
manager.save_trains_data() # 保存到文件
manager.save_seats_data() # 保存座位信息
print(f"车次 {train_id} 添加成功!")
"""删除车次"""
def delete_train(manager):
train_id = input("请输入要删除的车次编号:")
if train_id in manager.ticket_info:
del manager.ticket_info[train_id]
if train_id in manager.seat_map:
del manager.seat_map[train_id]
manager.save_trains_data() # 保存到文件
manager.save_seats_data() # 保存座位信息
print(f"车次 {train_id} 删除成功!")
else:
print(f"车次 {train_id} 不存在!")
"""修改车次"""
def modify_train(manager):
train_id = input("请输入要修改的车次编号:")
if train_id in manager.ticket_info:
print("请输入新的车次信息(直接回车保持原值):")
current_info = manager.ticket_info[train_id]
new_route = input(f"当前线路: {current_info[0]},新线路: ") or current_info[0]
new_departure = input(f"当前发车时间: {current_info[1]},新发车时间: ") or current_info[1]
new_arrival = input(f"当前到达时间: {current_info[2]},新到达时间: ") or current_info[2]
new_duration = input(f"当前历时: {current_info[3]},新历时: ") or current_info[3]
manager.ticket_info[train_id] = [new_route, new_departure, new_arrival, new_duration]
manager.save_trains_data() # 保存到文件
print(f"车次 {train_id} 修改成功!")
else:
print(f"车次 {train_id} 不存在!")
"""查询车次"""
def query_train(manager):
if not manager.ticket_info:
print("暂无车次信息!")
return
print("\n所有车次信息:")
print('车次\t线路\t\t发车时间\t到达时间\t历时')
for train_id, info in manager.ticket_info.items():
print(f"{train_id}\t{info[0]}\t{info[1]}\t{info[2]}\t{info[3]}")
'''============座位管理=============='''
def seat_management(manager):
"""座位管理系统"""
# 选择车次
if not manager.ticket_info:
print("暂无车次信息!")
return
print("\n可选车次:")
for train_id in manager.ticket_info:
print(f"- {train_id}")
train_id = input("请选择要管理座位的车次: ")
if train_id not in manager.ticket_info:
print("车次不存在!")
return
# 获取座位图
seat_map = manager.get_seat_map(train_id)
def display_seats():
'''显示座位图'''
print(f"\n=== {train_id} 车次座位图 ===")
print(" " + " ".join(str(i) for i in range(1, 6)))
for i, row in enumerate(seat_map):
print(f"{chr(65 + i)} " + " ".join(row))
print("====================")
print("说明: * - 可用座位, # - 已预订座位, X - 不可用座位")
def book_seat():
"""预订座位"""
display_seats()
seat = input("请输入要预订的座位号(例如A1): ").upper()
if len(seat) < 2 or not seat[0].isalpha() or not seat[1:].isdigit():
print("无效的座位号格式!")
return False
row = ord(seat[0]) - ord('A')
col = int(seat[1:]) - 1
if row < 0 or row >= len(seat_map) or col < 0 or col >= 5:
print("座位不存在!")
return False
if seat_map[row][col] == "*":
seat_map[row][col] = "#"
print(f"座位 {seat} 预订成功!")
manager.save_seats_data() # 保存座位信息
return True
elif seat_map[row][col] == "#":
print("该座位已被预订!")
return False
else:
print("该座位不可用!")
return False
def cancel_booking():
"""取消预订座位"""
display_seats()
seat = input("请输入要取消预订的座位号(例如A1): ").upper()
if len(seat) < 2 or not seat[0].isalpha() or not seat[1:].isdigit():
print("无效的座位号格式!")
return False
row = ord(seat[0]) - ord('A')
col = int(seat[1:]) - 1
if row < 0 or row >= len(seat_map) or col < 0 or col >= 5:
print("座位不存在!")
return False
if seat_map[row][col] == "#":
seat_map[row][col] = "*"
print(f"座位 {seat} 的预订已取消!")
# 查找并删除相关乘客信息
for index, passenger in enumerate(manager.trains):
if passenger.trains == train_id and passenger.seat == seat:
del manager.trains[index]
print(f"已删除乘客 {passenger.name} 的信息")
break
manager.save_data() # 保存乘客信息
manager.save_seats_data() # 保存座位信息
return True
elif seat_map[row][col] == "*":
print("该座位未被预订!")
return False
else:
print("该座位不可用!")
return False
while True:
print(f"\n=== {train_id} 车次座位管理系统 ===")
print("1. 显示座位图")
print("2. 预订座位")
print("3. 取消预订")
print("0. 返回主菜单")
choice = input("请选择操作:")
if choice == '1':
display_seats()
elif choice == '2':
book_seat()
elif choice == '3':
cancel_booking()
elif choice == '0':
break
else:
print("无效选择!")
'''============车票预定=============='''
def ticket_booking(manager):
# 打印车次信息
print('\n=== 可预订车次 ===')
print('车次\t线路\t\t发车时间\t到达时间\t历时')
for key, value in manager.ticket_info.items():
print(f"{key}\t{value[0]}\t{value[1]}\t{value[2]}\t{value[3]}")
# 车票预订逻辑
while True:
choice = input("\n请输入要预订的车次(输入'0'返回): ")
if choice == '0':
break
if choice in manager.ticket_info:
# 显示座位图
seat_map = manager.get_seat_map(choice)
print(f"\n=== {choice} 车次座位图 ===")
print(" " + " ".join(str(i) for i in range(1, 6)))
for i, row in enumerate(seat_map):
print(f"{chr(65 + i)} " + " ".join(row))
print("====================")
print("说明: * - 可用座位, # - 已预订座位, X - 不可用座位")
# 选择座位
seat = input("请选择座位号(例如A1): ").upper()
if len(seat) < 2 or not seat[0].isalpha() or not seat[1:].isdigit():
print("无效的座位号格式!")
continue
row = ord(seat[0]) - ord('A')
col = int(seat[1:]) - 1
if row < 0 or row >= len(seat_map) or col < 0 or col >= 5:
print("座位不存在!")
continue
if seat_map[row][col] != "*":
print("该座位不可用或已被预订!")
continue
# 输入乘客信息
passenger_name = input("请输入乘车人姓名: ")
try:
passenger_id = int(input("请输入乘客身份证号: "))
except ValueError:
print("身份证格式错误,请重新输入!")
continue
# 检查是否已存在
if any(train.id == passenger_id for train in manager.trains):
print("该乘客已存在,信息将更新!")
# 自动填写一些信息
origin, arrival = manager.ticket_info[choice][0].split('-')
# 添加乘客信息
manager.trains.append(
Trains(
name=passenger_name,
id=passenger_id,
trains=choice,
origin=origin,
arrival=arrival,
seat=seat,
time1=manager.ticket_info[choice][1],
time2=manager.ticket_info[choice][2]
)
)
# 标记座位为已预订
seat_map[row][col] = '#'
manager.save_data()
manager.save_seats_data()
print(f"\n您已成功预订车次 {choice}:")
print(f"线路: {manager.ticket_info[choice][0]}")
print(f"发车时间: {manager.ticket_info[choice][1]}, 到达时间: {manager.ticket_info[choice][2]}")
print(f"历时: {manager.ticket_info[choice][3]}")
print(f"座位号: {seat}")
print(f"请 {passenger_name} 准时乘车。")
else:
print("对不起,您输入的车次不存在,请重新输入。")
def main_menu():
# 初始化乘客信息管理器
passenger_manager = Manager("./data.txt", "./trains.txt", "./seats.txt")
while True:
print("\n=== 火车票务管理系统 ===")
print("1. 乘客信息管理")
print("2. 车次管理")
print("3. 座位管理")
print("4. 车票预订")
print("5. 取消预订")
print("6. 退出系统")
choice = input("请输入功能序号: ")
if choice == "1":
passenger_info_management(passenger_manager)
elif choice == "2":
train_management(passenger_manager)
elif choice == "3":
seat_management(passenger_manager)
elif choice == "4":
ticket_booking(passenger_manager)
elif choice == "5":
# 直接进入座位管理的取消预订功能
seat_management(passenger_manager)
elif choice == "6":
# 退出前保存所有数据
passenger_manager.save_data()
passenger_manager.save_trains_data()
passenger_manager.save_seats_data()
print("感谢使用,再见!")
break
else:
print("无效输入,请重新选择!")
if __name__ == "__main__":
main_menu()运行结果