python车票管理系统

班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数
1 8:00 郫县 广汉 2 45 30
2 6:30 郫县 成都 0.5 40 40
3 7:00 郫县 成都 0.5 40 20
4 10:00 郫县 成都 0.5 40 2
用python设计一系统,通过下列服务:
1.录入班次信息(用文件保存),可不定时增加班次数据
2.浏览班次信息,可显示出所有班次当前状态(如果当前系统时间超过了某班次党的发车时间,则显示“此班已发出”的提示信息)
3.查询路线:可按班号查询,可按终点站查询
4.售票和退票功能
(1)当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数。
(2)退票时,输入退票的班次,当末班车未发出时才能退票,自动更新已售票人数。

基于new bing加以修改的编写:
班车时间信息是实时的
【运行截图】

img


【代码】


import datetime

class Bus:
    def __init__(self, bus_id, start_time, start_station, end_station, travel_time, capacity, booked):
        self.bus_id = bus_id  # 班次号
        self.start_time = start_time  # 发车时间
        self.start_station = start_station  # 起点站
        self.end_station = end_station  # 终点站
        self.travel_time = travel_time  # 行车时间
        self.capacity = capacity  # 额定载量
        self.booked = booked  # 已定票人数

    def is_available(self):
        now = datetime.datetime.now()
        return now < self.start_time

    def __str__(self):
        return f"{self.bus_id} {self.start_time.strftime('%H:%M')} {self.start_station} {self.end_station} {self.travel_time} {self.capacity} {self.booked}"

class BusSystem:
    def __init__(self):
        self.buses = []

    def load_data(self, file_path):
        with open(file_path, "r", encoding="utf-8") as f:
            lines = f.readlines()
        for line in lines:
            items = line.strip().split(" ")
            bus_id, start_time_str, start_station, end_station, travel_time, capacity, booked = items
            start_time = datetime.datetime.strptime(start_time_str, '%H:%M')
            bus = Bus(bus_id, start_time, start_station, end_station, float(travel_time), int(capacity), int(booked))
            self.buses.append(bus)

    def save_data(self, file_path):
        with open(file_path, "w", encoding="utf-8") as f:
            for bus in self.buses:
                f.write(str(bus) + "\n")

    def add_bus(self):
        bus_id = input("请输入班次号:")
        start_time_str = input("请输入发车时间(HH:MM):")
        start_station = input("请输入起点站:")
        end_station = input("请输入终点站:")
        travel_time = float(input("请输入行车时间(小时):"))
        capacity = int(input("请输入额定载量:"))
        booked = 0
        start_time = datetime.datetime.strptime(start_time_str, '%H:%M')
        bus = Bus(bus_id, start_time, start_station, end_station, travel_time, capacity, booked)
        self.buses.append(bus)
        self.save_data("bus_data.txt")

    def view_buses(self):
        for bus in self.buses:
            status = "已发出" if not bus.is_available() else ""
            print(bus, status)

    def find_bus_by_id(self, bus_id):
        for bus in self.buses:
            if bus.bus_id == bus_id:
                return bus

    def find_buses_by_end_station(self, end_station):
        return [bus for bus in self.buses if bus.end_station == end_station]

    def buy_ticket(self, bus_id, num):
        bus = self.find_bus_by_id(bus_id)
        if not bus:
            print("班次不存在")
            return False
        if not bus.is_available():
            print("此班已发出")
            return False
        if bus.booked + num > bus.capacity:
            print("余票不足")
            return False
        bus.booked += num
        print(f"购买成功,当前已售票人数为{bus.booked}")
        return True

    def refund_ticket(self, bus_id, num):
        bus = self.find_bus_by_id(bus_id)
        if not bus:
            print("班次不存在")
            return False
        if not bus.is_available():
            print("此班已发出")
            return False
        if bus.booked < num:
            print("退票数量超过已售票数量")
            return False
        bus.booked -= num
        print(f"退票成功,当前已售票人数为{bus.booked}")
        return True

def view_all_buses(bus_system):
    bus_system.view_buses()

def search_by_id(bus_system):
    bus_id = input("请输入班次号:")
    bus_system.find_bus_by_id(bus_id)

def search_by_end_station(bus_system):
    end_station = input("请输入终点站:")
    bus_system.find_buses_by_end_station(end_station)

def buy(bus_system):
    bus_id = input("请输入班次号:")
    num = int(input("请输入购票数量:"))
    bus_system.buy_ticket(bus_id, num)
    bus_system.save_data("bus_data.txt")

def refund(bus_system):
    bus_id = input("请输入班次号:")
    num = int(input("请输入退票数量:"))
    bus_system.refund_ticket(bus_id, num)
    bus_system.save_data("bus_data.txt")

def main():
    bus_system = BusSystem()

    data=[
        [1,'8:00','郫县','广汉',2,45,30],
        [2,'6:30','郫县','成都',0.5,40,40],
        [3,'7:00','郫县','成都',0.5,40,20],
        [4,'10:00','郫县','成都',0.5,40,2]
    ]

    with open('bus_data.txt','a',encoding='utf-8') as f:
        for d in data:
            f.write(' '.join([str(x) for x in d]) + '\n')

    bus_system.load_data("bus_data.txt")

    while True:
        print("""
        1. 浏览班次信息
        2. 按班次号查询
        3. 按终点站查询
        4. 购票
        5. 退票
        6. 添加班次信息
        0. 退出
        """)
        choice = input("请选择操作:")

        if choice == "1":
            view_all_buses(bus_system)
        elif choice == "2":
            search_by_id(bus_system)
        elif choice == "3":
            search_by_end_station(bus_system)
        elif choice == "4":
            buy(bus_system)
        elif choice == "5":
            refund(bus_system)
        elif choice == "6":
            bus_system.add_bus()
        elif choice == "0":
            break
        else:
            print("无效选择,请重新选择")

if __name__ == "__main__":
    main()


动态输入班次信息,楼上提到的csv保存的话就显示太多了,txt即可:

img

import datetime

class Bus:
    def __init__(self, id, time, start, end, duration, capacity, sold):
        self.id = id
        self.time = time
        self.start = start
        self.end = end
        self.duration = duration
        self.capacity = capacity
        self.sold = sold

    def __str__(self):
        return f"{self.id}\t{self.time}\t{self.start}\t{self.end}\t{self.duration}\t{self.capacity}\t{self.sold}"

class BusSystem:
    def __init__(self, file_path):
        self.file_path = file_path
        self.buses = []
        self.load()

    def load(self):
        try:
            with open(self.file_path, 'r') as file:
                for line in file:
                    data = line.strip().split()
                    bus = Bus(data[0], datetime.datetime.strptime(data[1], "%H:%M"), data[2], data[3], float(data[4]), int(data[5]), int(data[6]))
                    self.buses.append(bus)
        except:
            pass

    def save(self):
        with open(self.file_path, 'w') as file:
            for bus in self.buses:
                file.write(str(bus) + "\n")

    def add_bus(self, id, time, start, end, duration, capacity, sold):
        bus = Bus(id, datetime.datetime.strptime(time, "%H:%M"), start, end, float(duration), int(capacity), int(sold))
        self.buses.append(bus)
        self.save()

    def list_buses(self):
        now = datetime.datetime.now().time()
        for bus in self.buses:
            if bus.time.time() < now:
                print(f"{bus} 已发出")
            else:
                print(bus)

    def search_bus(self, id):
        for bus in self.buses:
            if bus.id == id:
                return bus
        return None

    def search_end(self, end):
        result = []
        for bus in self.buses:
            if bus.end == end:
                result.append(bus)
        return result

    def sell_ticket(self, id):
        bus = self.search_bus(id)
        if bus is None:
            print("班次不存在")
        elif bus.sold >= bus.capacity:
            print("该班次已售罄")
        elif bus.time.time() < datetime.datetime.now().time():
            print("该班次已发出")
        else:
            bus.sold += 1
            self.save()
            print("售票成功")

    def refund_ticket(self, id):
        bus = self.search_bus(id)
        if bus is None:
            print("班次不存在")
        elif bus.sold == 0:
            print("该班次未售票")
        elif bus.time.time() < datetime.datetime.now().time():
            print("该班次已发出")
        else:
            bus.sold -= 1
            self.save()
            print("退票成功")

if __name__ == '__main__':
    system = BusSystem("buses.txt")
    while True:
        print("请选择操作:")
        print("1.录入班次信息")
        print("2.浏览班次信息")
        print("3.查询路线")
        print("4.售票")
        print("5.退票")
        print("0.退出系统")
        choice = input("请输入选项:")
        if choice == "1":
            id = input("请输入班次号:")
            time = input("请输入发车时间(格式为HH:MM):")
            start = input("请输入起点站:")
            end = input("请输入终点站:")
            duration = input("请输入行车时间(单位为小时):")
            capacity = input("请输入额定载量:")
            sold = 0
            system.add_bus(id, time, start, end, duration, capacity, sold)
            print("班次信息已录入")
        elif choice == "2":
            print("班次号\t发车时间\t起点站\t终点站\t行车时间\t额定载量\t已定票人数")
            system.list_buses()
        elif choice == "3":
            sub_choice = input("请选择查询方式(1.按班次号查询,2.按终点站查询):")
            if sub_choice == "1":
                id = input("请输入班次号:")
                bus = system.search_bus(id)
                if bus is None:
                    print("班次不存在")
                else:
                    print(f"{bus} 已发出" if bus.time.time() < datetime.datetime.now().time() else bus)
            elif sub_choice == "2":
                end = input("请输入终点站:")
                buses = system.search_end(end)
                if len(buses) == 0:
                    print("没有符合条件的班次")
                else:
                    print("班次号\t发车时间\t起点站\t终点站\t行车时间\t额定载量\t已定票人数")
                    for bus in buses:
                        print(f"{bus} 已发出" if bus.time.time() < datetime.datetime.now().time() else bus)
            else:
                print("无效的选项")
        elif choice == "4":
            id = input("请输入班次号:")
            system.sell_ticket(id)
        elif choice == "5":
            id = input("请输入班次号:")
            system.refund_ticket(id)
        elif choice == "0":
            break
        else:
            print("无效的选项")



import datetime

class BusSystem:
    def __init__(self, data_file):
        self.data_file = data_file

    def add_bus(self, bus_info):
        with open(self.data_file, 'a') as file:
            file.write(bus_info + '\n')

    def get_all_buses(self):
        current_time = datetime.datetime.now().strftime('%H:%M')
        with open(self.data_file, 'r') as file:
            buses = file.readlines()
            for bus in buses:
                bus_info = bus.strip().split(',')
                bus_no, departure_time = bus_info[0], bus_info[1]
                if current_time >= departure_time:
                    status = '此班已发出'
                else:
                    status = '待发车'
                print(f"班次:{bus_no} 发车时间:{departure_time} 状态:{status}")

    def search_bus_by_no(self, bus_no):
        with open(self.data_file, 'r') as file:
            buses = file.readlines()
            for bus in buses:
                bus_info = bus.strip().split(',')
                if bus_info[0] == bus_no:
                    return bus_info
            return None

    def search_bus_by_destination(self, destination):
        with open(self.data_file, 'r') as file:
            buses = file.readlines()
            result = []
            for bus in buses:
                bus_info = bus.strip().split(',')
                if bus_info[3] == destination:
                    result.append(bus_info)
            return result

    def sell_ticket(self, bus_no):
        current_time = datetime.datetime.now().strftime('%H:%M')
        with open(self.data_file, 'r+') as file:
            lines = file.readlines()
            file.seek(0)
            for line in lines:
                bus_info = line.strip().split(',')
                if bus_info[0] == bus_no:
                    if current_time >= bus_info[1] or int(bus_info[5]) >= int(bus_info[4]):
                        print("该班次无法售票")
                        file.writelines(lines)
                        file.truncate()
                        return
                    else:
                        bus_info[5] = str(int(bus_info[5]) + 1)
                file.write(','.join(bus_info) + '\n')

    def return_ticket(self, bus_no):
        current_time = datetime.datetime.now().strftime('%H:%M')
        with open(self.data_file, 'r+') as file:
            lines = file.readlines()
            file.seek(0)
            for line in lines:
                bus_info = line.strip().split(',')
                if bus_info[0] == bus_no:
                    if current_time >= bus_info[1] or int(bus_info[5]) <= 0:
                        print("该班次无法退票")
                        file.writelines(lines)
                        file.truncate()
                        return
                    else:
                        bus_info[5] = str(int(bus_info[5]) - 1)
                file.write(','.join(bus_info) + '\n')

# 示例使用
system = BusSystem('bus_data.txt')  # 替换为你的数据文件路径

# 1.录入班次信息
system.add_bus('1,8:00,郫县,广汉,2,45,30')
system.add_bus('2,6:30,郫县,成都,0.5,40,40')
system.add_bus('3,7:00,郫县,成都,0.5,40,20')
system.add_bus('4,10:00,郫县,成都,0.5,40,2')

# 2.浏览班次信息
system.get_all_buses()

# 3.查询路线
bus_info = system.search_bus_by_no('2')
if bus_info:
    print(f"班次:{bus_info[0]} 发车时间:{bus_info[1]} 起点站:{bus_info[2]} 终点站:{bus_info[3]} 行车时间:{bus_info[4]} 额定载量:{bus_info[5]} 已定票人数:{bus_info[6]}")
else:
    print("未找到相关班次")

buses_to_destination = system.search_bus_by_destination('成都')
for bus_info in buses_to_destination:
    print(f"班次:{bus_info[0]} 发车时间:{bus_info[1]} 起点站:{bus_info[2]} 终点站:{bus_info[3]} 行车时间:{bus_info[4]} 额定载量:{bus_info[5]} 已定票人数:{bus_info[6]}")

# 4.售票和退票功能
system.sell_ticket('2')
system.return_ticket('2')

您好,我在我的博文里回答的您的问题,请查阅:

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

这里是一个满足上述要求的Python系统设计:

  1. 班次信息存储在bus_info.txt文件中,格式为:
    班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数
  2. 显示所有班次信息的函数:
python
def show_all_bus():
    with open('bus_info.txt') as f:
        for line in f:
            bus_no, depart_time, start, end, duration, capacity, booked = line.strip().split()
            if datetime.now() > datetime.strptime(depart_time, '%H:%M'):
                print(f'此班已发出:{bus_no} {depart_time} {start}->{end}')
            else:
                print(f'{bus_no} {depart_time} {start}->{end} {booked}/{capacity}')

  1. 按班号或终点查询班次的函数:
python  
def query_by_no(bus_no):
    with open('bus_info.txt') as f:
        for line in f: 
            bn, *info = line.strip().split() 
            if bn == bus_no:
                return info

def query_by_end(end):
    results = []
    with open('bus_info.txt') as f:
        for line in f:
            _, *info = line.strip().split()
            if info[-2] == end:
                results.append(info)
    return results

  1. 售票和退票函数:
python
def buy_ticket(bus_no):
    info = query_by_no(bus_no)
    if datetime.now() < datetime.strptime(info[0], '%H:%M') and int(info[-1]) < int(info[-2]):
        with open('bus_info.txt') as f:  
            lines = f.readlines()
        lines[lines.index(line)] = line.strip() + ' ' + str(int(info[-1]) + 1) + '\n'
        with open('bus_info.txt', 'w') as f:  
            f.writelines(lines)
        print(f'购票成功!您购买的是{bus_no} {info[1]}->{info[-3]}的票')

def refund_ticket(bus_no):
    info = query_by_no(bus_no)
    if datetime.now() < datetime.strptime(info[0], '%H:%M'): 
        with open('bus_info.txt') as f:  
            lines = f.readlines()
        lines[lines.index(line)] = line.strip() + ' ' + str(int(info[-1]) - 1) + '\n'
        with open('bus_info.txt', 'w') as f:  
            f.writelines(lines)
        print(f'退票成功!您退票的是{bus_no} {info[1]}->{info[-3]}的票')

以上就是一个满足要求的简单地铁售票系统的Python实现方案。通过文件bus_info.txt存储班次信息,并提供显示、查询、售票和退票等功能。