一、需求

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

二、代码

本系统包含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
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        passs

    def show_all_information(self):
        """输出所有停车场信息,按车位使用情况分类,同一分类中按编号升序排序"""
        # 初始化刷新数据
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        pass

    def query_by_car_number(self):
        """按车牌号查找停车信息"""
        # 接收车牌编号
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        pass

    def query_by_car_type(self):
        """按车类型查找停车信息"""
        # 接受车类型
        # 需要完整代码请在文章文章底部添加微信,付费咨询
       pass

    def query_by_date(self):
        """按使用日期查找停车信息"""
        # 接收查询日期
        date = input("请输入查询日期(格式参考:1998-06-06):")
        # 创建列表保存查询结果
        # 需要完整代码请在文章文章底部添加微信,付费咨询
       pass

    def query_by_handler(self):
        """按经手人查找停车信息"""
        # 接收经手人姓名
        handler = input("请输入经手人姓名:")
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        pass

    def query_history_results(self):
        """查询停车场历史记录"""
        # 查询输入格式化
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        print("id  car_type  p_number  car_number   handler   price    cost     entrance_time            exit_time")
        

    def driving_out(self):
        """出场:删除对应车位的车辆信息,更新数据文件"""
        # 接收出场时间
        exit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 接收车牌号
        car_number = input("请输入出场车辆车牌号(示例:京A88888):")
        # 遍历总停车信息列表,找到该条数据并将其移除列表
        pass

    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"))
        # 计算停车时间,单位转化为小时
        pass

    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):
        """格式化打印输出查询结果"""
        # 需要完整代码请在文章文章底部添加微信,付费咨询
        pass

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 退出管理系统

在这里插入图片描述

Logo

快速构建 Web 应用程序

更多推荐