首頁 > 軟體

python實現停車場管理系統

2022-06-02 18:01:20

本文範例為大家分享了python實現停車場管理系統的具體程式碼,供大家參考,具體內容如下

一、需求

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com