欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python实现停车场管理系统

程序员文章站 2022-07-11 12:30:29
1. 为一个车位数量固定的停车场,设计一个管理系统;2. 停车信息包括:编号、车牌号(若存在)、类型、车位编号、使用日期、入场时间、单价、费用、经手人3. 停车信息存储在数据文件中,程序至少实现功能:浏览、查询、入场、出场、导出、计费、系统菜单4. 按面向对象程序设计方法进行类的定义:选择合适的数据存储结构,并定义相应的数据元素类,选择合理的操作方法定义相应的算法实现类...



一、需求

  1. 为一个车位数量固定的停车场,设计一个管理系统;
  2. 停车信息包括:编号、车牌号(若存在)、类型、车位编号、使用日期、入场时间、单价、费用、经手人
  3. 停车信息存储在数据文件中,程序至少实现功能:浏览、查询、入场、出场、导出、计费、系统菜单
  4. 按面向对象程序设计方法进行类的定义:选择合适的数据存储结构,并定义相应的数据元素类,选择合理的操作方法定义相应的算法实现类

二、代码

本系统包含4部分(4个py文件,剩余为测试数据文件),组成放在一个文件夹组成一个模块,如下图。
Python实现停车场管理系统

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 浏览所有信息

Python实现停车场管理系统

3.2 查询车辆信息

3.2.1 按车牌号查找

Python实现停车场管理系统

3.2.2 按车类型查找

Python实现停车场管理系统

3.2.3 按使用日期查找

Python实现停车场管理系统

3.2.4 按经手人查找

Python实现停车场管理系统

3.2.5 查询历史记录

Python实现停车场管理系统

3.3 入场车辆录入

Python实现停车场管理系统

3.4 出场车辆删除

Python实现停车场管理系统

3.5 退出管理系统

Python实现停车场管理系统

本文地址:https://blog.csdn.net/Artificial_idiots/article/details/108248070

相关标签: python 停车场