本系统包含4部分(4个py文件,剩余为测试数据文件),组成放在一个文件夹组成一个模块,如下图。
"""
__init__.py 模块的作用:在导入包的时候自动执行这里的代码,进行初始化工作
"""
# 允许被 from package_name import * 导入的模块
__all__ = ['ParkingManagementSystem', 'Car']
# 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()
# 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)
# 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))