基於Python制作公交車站查詢系統

一、設計目的

1、教學目的

本課程設計是學生學習完《Python程序設計》課程後,進行的一次全面的綜合訓練,通過課程設計,更好地掌握使用Python語言進行程序設計的方法,加深對Python語言特點和使用Python語言進行程序設計開發過程的理解,加強動手能力。其主要目的是:

(1)進一步培養學生Python程序設計的思想,加深對高級語言基本語言要素和控制結構的理解;

(2)針對Python語言中的重點和難點內容進行訓練,獨立完成有一定工作量的程序設計任務,同時強調好的程序設計風格。

(3)掌握Python語言的編程技巧和上機調試程序的方法。

(4)掌握程序設計的常用算法。

2、教學要求

(1)要求從所給題目中任選若幹個,每個學生必須獨立完成課程設計,不能互相抄襲。

(2)設計完成後,對所完成的工作進行答辯。

(3)要求寫出一份詳細的課程設計報告。

(4)程序設計題目,須提交相應的程序,並需提供加註釋的源程序,能正常運行。

二、需求分析

1、問題

根據需求,該系統所應包含的信息有以下一些:

後臺用戶管理員的基本信息:

賬號、密碼

各路公交車的基本信息:

每路公交車對應的線路信息

2、系統

采用Python語言實現,開發環境為PythonCharm,可以運行在操作系統windows98及以上皆可。

3、運行要求

界面友好,操作方便,容錯性強。

三、系統模塊設計

主界面模塊:完成系統菜單的顯示。

功能選擇模塊:根據用戶的選擇,完成其相應的功能。

線路查詢模塊:根據用戶提供的線路,查詢該線路所經過的站點。

站點查詢的模塊:根據用戶提供的站點,查詢經過該站點的所有線路。

後臺管理員的模塊:後臺管理員可以進行一些操作,例如:刪除所有線路、添加線路等

後臺管理員的賬號系統管理的模塊:註冊後臺管理員的賬號和密碼。

換乘信息的模塊:根據用戶提供的起點和終點,幫助用戶找到最便捷的路線。

四、詳細設計

五、需要設計的函數

主函數。

管理員賬號管理界面的函數。

用戶登錄的函數。

後臺管理員界面的函數。

定義修改線路的函數。

判斷是否存在線路的函數。

線路查詢的函數。

判斷站點是否存在的函數。

站點查詢的函數。

檢查添加線路是否存在的函數。

添加線路的函數。

清楚所有線路的函數。

展示所有線路的函數。

刪除線路的函數。

判斷是否存在線路的函數。

展示特定線路中的站點的函數。

換乘信息的函數。

判斷線路直達的函數。

存儲數據的函數。

斷站點所在的線路的函數。

六、Python源碼

import os
import pickle


def main():  # 主函數
    while True:
        print('-' * 30)
        print('------菜單------')
        print('1.線路查詢')
        print('2.站點查詢')
        print('3.換乘信息')
        print('4.後臺管理員界面')
        print('5.管理員的賬號管理界面')
        print('6.退出程序')
        print('-' * 30)
        num = int(input('請選擇你的操作:\n'))
        if num == 1:
            line_find()
            continue
        if num == 2:
            site_find()
            continue
        if num == 3:
            change_line()
            continue
        if num == 5:
            manager_account()
            continue
        if num == 6:
            break
        if num == 4:
            manager()
            continue
        else:
            print('請重新做出你的選擇!!')


def manager_account():  # 管理員賬號管理界面的函數
    def new_():
        file_path = 'D:\公交查詢系統\info.pkl'
        a = input('請設置你的賬號:')
        b = input('請設置入你的密碼:')
        w = input('請再次輸入你的的密碼:')
        d = {
            'user': a,
            'password': b
        }
        if b == w:
            if os.path.exists(file_path) and os.path.getsize(file_path):
                o = open('info.pkl', 'rb')
                m = pickle.load(o)
                with open('info.pkl', 'ab') as fp:
                    pickle.dump(d, fp)
                print('您已經註冊成功!!')
            else:
                with open('info.pkl', 'wb') as fp:
                    pickle.dump(d, fp)
                print('您已經註冊成功!!')
        else:
            print('對不起,你兩次輸入的密碼不一致,請您重新輸入!!')

    def xiaohui():
        h = open('info.pkl', 'w+')  # 清空文件裡的內容。。。
        h.truncate()
        print('你已經銷毀成功。。。')

    while True:
        print('-----管理員的賬號管理界面------\n'
              '1.註冊\n'
              '2.註銷原有的所有賬戶\n'
              '3.退出管理員的賬號管理界面')
        choice = input('請做出你的選擇:\n')
        if choice == '1':
            new_()
        if choice == '2':
            xiaohui()
        elif choice == '3':
            print('-' * 35)
            print('------菜單------')
            print('1.線路查詢')
            print('2.站點查詢')
            print('3.換乘信息')
            print('4.後臺管理員界面')
            print('5.管理員的賬號管理界面')
            print('6.退出程序')
            print('-' * 35)
            break
        else:
            print('請重新做出你的選擇')


def login():  # 用戶登錄的函數
    with open('info.pkl', 'rb') as fp:
        q = input('請輸入你的的賬號:')
        w = input('請輸入你的的密碼:')
        while True:
            try:
                data = pickle.load(fp)
                if q == data['user'] and w == data['password']:
                    print('您已經登錄成功!!!')
                    return True

            except:
                break


def manager():  # 後臺管理員界面的函數
    if login():
        while True:
            print('-' * 30)
            print('-----後臺管理員界面-----')
            print('1.添加線路')
            print('2.刪除線路')
            print('3.修改線路')
            print('4.查看所有線路')
            print('5.刪除所有線路')
            print('6.退出')
            print('-' * 30)
            num = input('請做出你的選擇:\n')
            if num == '3':
                revise_line()
                continue
            if num == '1':
                add_line()
                continue
            if num == '6':
                print('-' * 25)
                print('------菜單------')
                print('1.線路查詢')
                print('2.站點查詢')
                print('3.換乘信息')
                print('4.後臺管理員界面')
                print('5.管理員的賬號管理界面')
                print('6.退出程序')
                print('-' * 25)
                break
            if num == '5':
                clear_line_all()
                continue
            if num == '4':
                show_line_all()
                continue
            if num == '2':
                num = input('請輸入你要刪除的線路:\n').strip()
                clear_line(num)
                continue
            else:
                print('請重新做出你的選擇...')
    else:
        print('對不起,你登錄失敗,不可以讓您進入後臺管理員界面')


def revise_line():  # 定義修改線路的函數
    num = input('請輸入您要修改的線路:').strip()
    if check_add_line(num):
        show_line_all()
        tag = input('請確認是否繼續修改線路:(1為是,0為否)\n')
        if tag == '1':
            file_path = 'D:\公交查詢系統\line_info.pkl'
            a = input('請再次輸入要修改的線路:').strip()
            clear_line(a)
            b = input('請輸入經過的站點:')
            d = {
                a: {b}
            }
            if os.path.exists(file_path) and os.path.getsize(file_path):
                with open('line_info.pkl', 'ab') as f:
                    pickle.dump(d, f)
                print('您已經修改線路成功!!')
            else:
                with open('line_info.pkl', 'wb') as fp:
                    pickle.dump(d, fp)
                print("您已經修改線路成功瞭!!!!")
    else:
        print('您要修改的線路不存在,需要創建一個新的線路。。。')
        add_line()


def line_check(num):  # 判斷是否存在線路的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    print(f'{num}號線的路線經過的站點為{data[num]}')
                    return True
            except:
                break


def line_find():  # 線路查詢的函數
    num = input('請輸入你要查詢的線路:\n').strip()
    if line_check(num):
        pass
    else:
        print('您要查找的線路不存在....')


def site_check():  # 判斷站點是否存在的函數
    res = []
    with open('line_info.pkl', 'rb') as fp:
        num = input('請輸入你要查詢的站點名:\n').strip()
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    ls = str(value)
                    if num in ls:
                        res.append(f'經過{num}站點的線路為{key}號線')
                        continue
            except:
                break
    if res:
        print(res)
        return True
    else:
        return False


def site_find():  # 站點查詢的函數
    if site_check():
        pass
    else:
        print('您要查詢的站點不存在.....')


def check_add_line(num):  # 檢查添加線路是否存在的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    if num in key:
                        return True
            except:
                break


def add_line():  # 添加線路的函數
    file_path = 'D:\公交查詢系統\line_info.pkl'
    a = input('請輸入添加的線路:').strip()
    b = input('請輸入經過的站點:')
    d = {
        a: {b}
    }
    if os.path.exists(file_path) and os.path.getsize(file_path):
        if check_add_line(a):
            print('您要添加的線路已經存在瞭......')
        else:
            with open('line_info.pkl', 'ab') as f:
                pickle.dump(d, f)
            print('您已經添加線路成功!!')
    else:
        with open('line_info.pkl', 'wb') as fp:
            pickle.dump(d, fp)
        print('您已經添加線路成功瞭!!')


def clear_line_all():  # 清除所有線路的函數
    h = open('line_info.pkl', 'w+')  # 清空文件裡的內容。。。
    h.truncate()
    print('你已經銷毀成功。。。')


def show_line_all():  # 展示所有線路的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    print(f'{key}線路經過的站點是{value}')
            except:
                break


def clear_line(num):  # 刪除線路的函數
    with open('line_info.pkl', 'rb') as fp:
        ls = []
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    if num in key:
                        print(f'{num}線路已經刪除成功!!')
                        pass
                    else:
                        ls.append(data)
            except:
                break
        save_data(ls)


def line_check(num):  # 判斷是否存在線路的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    print(f'{num}號線的路線經過的站點為{data[num]}')
                    return True
            except:
                break


def show_site(num):  # 展示特定線路中的站點的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                if num in data:
                    return data[num]
            except:
                break


def change_line():  # 換乘信息的函數
    begin = input('請輸入你的起點站點:\n').strip()
    end = input('請輸入你的終點站點:\n').strip()
    if direct_line(begin, end):
        pass
    else:
        ls = []  # 存儲經過起點的線路的全部站點
        ls_ = []  # 存儲經過終點的線路的全部站點
        tag = True
        data = check_site(begin, end)
        # print(type(data[0]),type(data[1]))
        print(f'經過{begin}站點的線路為:{data[0]},經過{end}站點的線路為{data[1]}')  # 判斷經過起始點和終點的對應線路
        for i in range(len(list(data)[0])):
            ls.append(show_site(data[0][i]))
            print(f"{line_check(str(data[0][i]))}")
        for j in range(len(list(data)[1])):
            ls_.append(show_site(data[1][j]))
            print(f"{line_check(str(data[1][j]))}")
        for i in ls:  # i為集合的形式
            for a in list(i):
                for b in str(a).split():  # 切割字符串
                    if b in str(ls_):  # 判斷是否存在相同的站點
                        tag = False
                        print(f"您可以通過從{data[0]}號線的{b}站轉到{data[1]}號線來到達目的地!!")
            #             break
            #         break
            #     break
            # break
        if tag:
            print('對不起,無法通過換乘來到達目的地')


def direct_line(begin, end):  # 判斷線路直達的函數
    with open('line_info.pkl', 'rb') as fp:
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    ls = str(value)
                    if begin in ls and end in ls:
                        print(f'您可以通過{key}號線路直接到達')
                        return True
            except:
                break


def save_data(ls):  # 存儲數據的函數
    with open('line_info.pkl', 'wb') as fp:
        for data in ls:
            pickle.dump(data, fp)


def check_site(begin, end):  # 判斷站點所在的線路的函數。
    with open('line_info.pkl', 'rb') as fp:
        ls = []
        ls_ = []
        while True:
            try:
                data = pickle.load(fp)
                # 遍歷字典
                for key, value in data.items():
                    ls1 = str(value)
                    if begin in ls1:
                        ls.append(key)
                    if end in ls1:
                        ls_.append(key)
            except:
                break
        return ls, ls_


# def help_change_line_info(i, j):
#     with open('line_info.pkl', 'rb') as fp:
#         ls = []
#         ls_ = []
#         while True:
#             try:
#                 data = pickle.load(fp)
#                 # 遍歷字典
#                 for key, value in data.items():
#                     ls1 = str(key)
#                     if i in ls1:
#                         ls.append(value)
#                     if j in ls1:
#                         ls_.append(value)
#             except:
#                 break
#         return ls, ls_


if __name__ == 'main':
    main()

main()



七、運行效果

視頻鏈接

到此這篇關於基於Python制作公交車站查詢系統的文章就介紹到這瞭,更多相關Python公交車站查詢系統內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: