Python实现停车场管理系统
程序员文章站
2022-07-11 12:30:29
1. 为一个车位数量固定的停车场,设计一个管理系统;2. 停车信息包括:编号、车牌号(若存在)、类型、车位编号、使用日期、入场时间、单价、费用、经手人3. 停车信息存储在数据文件中,程序至少实现功能:浏览、查询、入场、出场、导出、计费、系统菜单4. 按面向对象程序设计方法进行类的定义:选择合适的数据存储结构,并定义相应的数据元素类,选择合理的操作方法定义相应的算法实现类...
Python实现简易停车场管理系统
一、需求
- 为一个车位数量固定的停车场,设计一个管理系统;
- 停车信息包括:编号、车牌号(若存在)、类型、车位编号、使用日期、入场时间、单价、费用、经手人
- 停车信息存储在数据文件中,程序至少实现功能:浏览、查询、入场、出场、导出、计费、系统菜单
- 按面向对象程序设计方法进行类的定义:选择合适的数据存储结构,并定义相应的数据元素类,选择合理的操作方法定义相应的算法实现类
二、代码
本系统包含4部分(4个py文件,剩余为测试数据文件),组成放在一个文件夹组成一个模块,如下图。
2.1 初始化模块__init__.py
"""
__init__.py 模块的作用:在导入包的时候自动执行这里的代码,进行初始化工作
""" # 允许被 from package_name import * 导入的模块 __all__ = ['ParkingManagementSystem', 'Car']
2.2 主程序模块main.py
# coding = utf-8 from ParkingManagementSystem import * from Car import * def main(): # 创建停车信息管理系统对象 p = ParkingManagementSystem() # 创建一个停车对象 car = Car() while True: print("") print("******************* 欢迎进入:停车场信息管理系统 *******************") print("------------------------- 1.浏览所有信息 ------------------------") print("------------------------- 2.查询车辆信息 ------------------------") print("------------------------- 3.入场车辆录入 ------------------------") print("------------------------- 4.出场车辆删除 ------------------------") print("------------------------- 5.退出管理系统 ------------------------") try: # 接收输入指令 cmd = int(input("请输入指令数字:")) # 1.浏览所有信息 if cmd == 1: p.show_all_information() # 2.查询车辆信息 elif cmd == 2: while True: print("------ 1.按车牌号查找 ------") print("------ 2.按车类型查找 ------") print("------ 3.按使用日期查找 -----") print("------ 4.按经手人查找 ------") print("------ 5.查询历史记录 ------") print("------ 6.返回上级菜单 ------") query = int(input("请输入指令数字:")) # 1.按车牌号查找 if query == 1: query_results = p.query_by_car_number() # 判定查询结果是否为空(False),是则不保存 if query_results: decide = input("是否需要保存查询结果(输入:yes/no):") if decide == "yes": p.save_query_results_to_file(query_results) # 2.按车类型查找 elif query == 2: query_results = p.query_by_car_type() # 判定查询结果是否为空(False),是则不保存 if query_results: decide = input("是否需要保存查询结果(输入:yes/no):") if decide == "yes": p.save_query_results_to_file(query_results) # 3.按使用日期查找 elif query == 3: query_results = p.query_by_date() # 判定查询结果是否为空(False),是则不保存 if query_results: decide = input("是否需要保存查询结果(输入:yes/no):") if decide == "yes": p.save_query_results_to_file(query_results) # 4.按经手人查找 elif query == 4: query_results = p.query_by_handler() # 判定查询结果是否为空(False),是则不保存 if query_results: decide = input("是否需要保存查询结果(输入:yes/no):") if decide == "yes": p.save_query_results_to_file(query_results) # 5.查询历史记录 elif query == 5: p.query_history_results() else: break # 3.录入车辆信息 elif cmd == 3: # 接收停车车辆信息 parking_info = car.get_parking_info() p.parking(parking_info) # 4.删除车辆信息 elif cmd == 4: p.driving_out() # 5.退出管理系统 else: # 保存停车信息的最大编号 id car.save_id_to_file() print("感谢使用停车场管理系统,再见!") break except Exception as result: # 保存停车信息的最大编号 id car.save_id_to_file() # 保存停车信息 p.save_to_file() print("感谢使用停车场管理系统,再见!") break if __name__ == "__main__": main()
2.3 停车管理模块ParkingManagementSystem.py
# coding = utf-8 # 模块中的__all__属性:可以规定 模块中 from module_name import * 只能够导入的一些类、变量、函数名 __all__ = ['ParkingManagementSystem'] import time class ParkingManagementSystem(object): """算法实现类:停车场信息管理系统""" def __init__(self): """对停车信息进行初始化""" # 测试时使用 print("ParkingManagementSystem的__init__函数被调用") # 车位编号存放列表 self.car_stall = [] self.truck_stall = [] # 所有停车信息存放列表 self.total_info = [] # 读取停车场数据 try: with open("parking_data.txt", "r") as file: for line in file.readlines(): # 将字符串转化为字典,遇到空行时跳过,防止eval()函数转化空行或者空字符时报错 try: info_dict = eval(line) self.total_info.append(info_dict) if info_dict["car_type"] == "car": self.car_stall.append(info_dict["p_number"]) else: self.truck_stall.append(info_dict["p_number"]) except Exception as result: continue except Exception as result: print("停车信息数据文件不存在!") # 测试时使用 # print(self.car_stall) # print(self.truck_stall) # print(self.total_info) def parking(self, parking_info): """入场停车:传入停车信息,在空的车位中增加车辆信息,更新数据文件""" # 判断传入停车信息是否为 None if parking_info is None: return else: # 传入停车信息,将新的停车信息存入到列表 self.total_info.append(parking_info) # 测试时使用 print(self.total_info) # 将数据更新到文件中 self.save_to_file() def show_all_information(self): """输出所有停车场信息,按车位使用情况分类,同一分类中按编号升序排序""" # 初始化刷新数据 self.__init__() # 对car类型的车辆所在车位编号进行排序 self.car_stall.sort() # print(self.car_stall) # 按car类型显示停车信息 print("") # 查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历car类型车位编号,按该编号顺序显示停车信息 for i in self.car_stall: for info_dict in self.total_info: if info_dict['p_number'] == i: print(" %s %s %s %s %s %s" % (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["entrance_time"])) print("") # # 对truck类型的车辆所在车位编号进行排序 self.truck_stall.sort() # print(self.truck_stall) # 按truck类型显示停车信息,查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历truck类型车位编号,按该编号顺序显示停车信息 for i in self.truck_stall: for info_dict in self.total_info: if info_dict['p_number'] == i: # print(info_dict) print(" %s %s %s %s %s %s" % (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["entrance_time"])) def query_by_car_number(self): """按车牌号查找停车信息""" # 接收车牌编号 car_number = input("请输入车牌号(示例:京A88888):") # 创建列表保存查询结果 query_results = [] # 查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中 for info_dict in self.total_info: if info_dict["car_number"] == car_number: self.print_func(info_dict, query_results) # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False if len(query_results) > 0: return query_results else: print("未找到相关停车信息!") return False def query_by_car_type(self): """按车类型查找停车信息""" # 接受车类型 car_type = input("请输入车类型(car 或 truck):") # 创建列表保存查询结果 query_results = [] # 查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中 for info_dict in self.total_info: if info_dict["car_type"] == car_type: self.print_func(info_dict, query_results) # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False if len(query_results) > 0: return query_results else: print("未找到相关停车信息!") return False def query_by_date(self): """按使用日期查找停车信息""" # 接收查询日期 date = input("请输入查询日期(格式参考:1998-06-06):") # 创建列表保存查询结果 query_results = [] # 查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中 for info_dict in self.total_info: if info_dict["date"] == date: self.print_func(info_dict, query_results) # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False if len(query_results) > 0: return query_results else: print("未找到相关停车信息!") return False def query_by_handler(self): """按经手人查找停车信息""" # 接收经手人姓名 handler = input("请输入经手人姓名:") # 创建列表保存查询结果 query_results = [] # 查询输入格式化 print("car_type p_number car_number handler price entrance_time") # 遍历总的列表,匹配符合条件的停车信息,并加入到查询结果列表中 for info_dict in self.total_info: if info_dict["handler"] == handler: self.print_func(info_dict, query_results) # 判定是否查询到符合条件的结果,如有返回查询结果列表,如没有打印提示信息并返回 False if len(query_results) > 0: return query_results else: print("未找到相关停车信息!") return False def query_history_results(self): """查询停车场历史记录""" # 查询输入格式化 print("id car_type p_number car_number handler price cost entrance_time exit_time") try: # 读取历史记录数据,如有则显示 with open("history_data.txt", "r") as file: for line in file.readlines(): # 将字符串转化为字典,遇到空行时跳过,防止eval()函数转化空行或者空字符时报错 try: info_dict = eval(line) if info_dict["car_type"] == "car": # 格式化输出 print("%s %s %s %s %s %s %s %s %s" % (info_dict["id"], info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["cost"], info_dict["entrance_time"], info_dict["exit_time"])) else: # 格式化输出 print("%s %s %s %s %s %s %s %s %s" % (info_dict["id"], info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["cost"], info_dict["entrance_time"], info_dict["exit_time"])) except Exception as result: continue except Exception as result: print("暂未发现历史记录!") def driving_out(self): """出场:删除对应车位的车辆信息,更新数据文件""" # 接收出场时间 exit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 接收车牌号 car_number = input("请输入出场车辆车牌号(示例:京A88888):") # 遍历总停车信息列表,找到该条数据并将其移除列表 for info_dict in self.total_info: if info_dict["car_number"] == car_number: # 将出场时间更新到该条数据中 info_dict["exit_time"] = exit_time # 对出场车辆计费 cost = self.charging(info_dict) # 将消费金额更新到该条数据中 info_dict["cost"] = cost # 将该车位编号从列表中移除 if info_dict["car_type"] == "car": self.car_stall.remove(info_dict["p_number"]) elif info_dict["car_type"] == "truck": self.truck_stall.remove(info_dict["p_number"]) # 将该条停车信息从总的停车信息列表中删除 self.total_info.remove(info_dict) # 将数据更新到文件中 self.save_to_file() # 将已出场的停车数据保存到文件 self.save_history_to_file(info_dict) print("车辆出场成功!") break else: print("未找到符合要求的车辆,请确认后输入!") def charging(self, info_dict): """计费: 传入停车信息,按小时计费""" # 接收车辆停车信息 # 将时间由字符串格式转化为数字格式,以秒为单位 exit_time = time.mktime(time.strptime(info_dict["exit_time"], "%Y-%m-%d %H:%M:%S")) entrance_time = time.mktime(time.strptime(info_dict["entrance_time"], "%Y-%m-%d %H:%M:%S")) # 计算停车时间,单位转化为小时 parking_time = (exit_time - entrance_time)/3600 # 计算消费金额 cost = round(info_dict["price"] * parking_time, 0) print("停车时间为:%.2f 小时, 停车费为:%d 元" % (parking_time, cost)) # 返回停车消费金额 return cost def save_to_file(self): """将停车数据保存到文件""" # 打开数据文件,保存数据 with open("parking_data.txt", "w") as file: for info_dict in self.total_info: # 将字典转化为字符串保存 file.write(str(info_dict)) file.write("\n") def save_history_to_file(self, info_dict): """将已完成出场停车数据保存到文件""" # 打开数据文件,保存数据 with open("history_data.txt", "a") as file: # 将字典转化为字符串保存 file.write(str(info_dict)) file.write("\n") def save_query_results_to_file(self, query_results): """将查询结果保存到指定数据文件""" # 接收输入文件名 file_name = input("请输入要保存数据的文件名(格式:xxx.txt ):") with open(file_name, "a") as file: # 将数据转化为字符串保存 file.write(str(query_results)) file.write("\n") print("查询结果保存成功,文件名为:%s" % file_name) def print_func(self, info_dict, query_results): """格式化打印输出查询结果""" if info_dict["car_type"] == "car": # print(info_dict) print(" %s %s %s %s %s %s" % (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["entrance_time"])) query_results.append(info_dict) elif info_dict["car_type"] == "truck": print(" %s %s %s %s %s %s" % (info_dict["car_type"], info_dict["p_number"], info_dict["car_number"], info_dict["handler"], info_dict["price"], info_dict["entrance_time"])) query_results.append(info_dict)
2.4 车元素模块Car.py
# coding = utf-8 # 模块中的__all__属性:可以规定 模块中 from module_name import * 只能够导入的一些类、变量、函数名 __all__ = ['Car'] import time from ParkingManagementSystem import * class Car(ParkingManagementSystem): """数据元素类:定义一个关于车的类""" def __init__(self): """对车的属性进行初始化""" # 测试时使用 print("Car 中__init__调用成功!") # 设定初始出场时间和消费金额为空 self.exit_time = None self.cost = None # 初始编号 id 为 1 self.id = 1 # 读取文件中编号 try: with open("count_id.txt", "r") as file: self.id = int(file.read()) except Exception as result: pass # 测试时使用 print(self.id) def get_parking_info(self): """获取车辆停车信息""" # 调用父类中的属性 ParkingManagementSystem.__init__(self) car_type = input("请输入车类型(car 或 truck):") # 判断车位是否已满,如已满则提示客户去其他停车场,如未满则分配一个车位给客户 if car_type == "car": # 如车位已满,提醒客户去其他停车场,car类型的车位设定为100个 if len(self.car_stall) >= 100: print("小汽车车位已满,请去其他停车场。") return # 如还有车位,则分配一个车位给客户 else: # 不同车型不同价位 price = 10 # 车位编号为:1-100 for i in range(100): # 分配空着的车位编号 if i + 1 not in self.car_stall: p_number = i + 1 self.car_stall.append(p_number) print(self.car_stall) break elif car_type == "truck": # 如车位已满,提醒客户去其他停车场,truck类型的车位设定为50个 if len(self.truck_stall) >= 50: print("货车车位已满,请去其他停车场。") return # 如还有车位,则分配一个车位给客户 else: # 不同车型不同价位 price = 20 # 车位编号为:101-150 for i in range(100, 150): # 分配空着的车位编号 if i + 1 not in self.truck_stall: p_number = i + 1 self.truck_stall.append(p_number) print(self.truck_stall) break else: print("本停车场没有适合该车型的停车位,请重新输入!") return # 接收车位编号 car_number = input("请输入车牌号(示例:京A88888):") # 接收经手人姓名 handler = input("请输入经手人姓名:") # 接收入场时间 entrance_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 接收使用日期 date = time.strftime("%Y-%m-%d", time.localtime()) # 编号 id 自动增长 self.id += 1 # 保存该条停车信息到字典 parking_info = { "id": self.id, "car_type": car_type, "car_number": car_number, "handler": handler, "p_number": p_number, "date": date, "entrance_time": entrance_time, "exit_time": self.exit_time, "price": price, "cost": self.cost } print(parking_info) # 返回车辆停车信息 return parking_info def save_id_to_file(self): """保存停车信息的最大编号 id ,作为下次运行id增长的基础""" with open("count_id.txt", "w") as file: file.write(str(self.id))
三、运行测试
3.1 浏览所有信息
3.2 查询车辆信息
3.2.1 按车牌号查找
3.2.2 按车类型查找
3.2.3 按使用日期查找
3.2.4 按经手人查找
3.2.5 查询历史记录
3.3 入场车辆录入
3.4 出场车辆删除
3.5 退出管理系统
本文地址:https://blog.csdn.net/Artificial_idiots/article/details/108248070
上一篇: 凭什么你玩抖音不赚钱,他们却赚的盆满钵满
下一篇: 即将改变电商行业版图的张帆和他的爱善天使