溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于Python如何制作公交車站查詢系統(tǒng)

發(fā)布時(shí)間:2022-01-19 13:24:05 來源:億速云 閱讀:199 作者:kk 欄目:開發(fā)技術(shù)

這篇文章給大家介紹基于Python如何制作公交車站查詢系統(tǒng),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

    一、設(shè)計(jì)目的

    1、教學(xué)目的

    本課程設(shè)計(jì)是學(xué)生學(xué)習(xí)完《Python程序設(shè)計(jì)》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,通過課程設(shè)計(jì),更好地掌握使用Python語言進(jìn)行程序設(shè)計(jì)的方法,加深對(duì)Python語言特點(diǎn)和使用Python語言進(jìn)行程序設(shè)計(jì)開發(fā)過程的理解,加強(qiáng)動(dòng)手能力。其主要目的是:

    (1)進(jìn)一步培養(yǎng)學(xué)生Python程序設(shè)計(jì)的思想,加深對(duì)高級(jí)語言基本語言要素和控制結(jié)構(gòu)的理解;

    (2)針對(duì)Python語言中的重點(diǎn)和難點(diǎn)內(nèi)容進(jìn)行訓(xùn)練,獨(dú)立完成有一定工作量的程序設(shè)計(jì)任務(wù),同時(shí)強(qiáng)調(diào)好的程序設(shè)計(jì)風(fēng)格。

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

    (4)掌握程序設(shè)計(jì)的常用算法。

    2、教學(xué)要求

    (1)要求從所給題目中任選若干個(gè),每個(gè)學(xué)生必須獨(dú)立完成課程設(shè)計(jì),不能互相抄襲。

    (2)設(shè)計(jì)完成后,對(duì)所完成的工作進(jìn)行答辯。

    (3)要求寫出一份詳細(xì)的課程設(shè)計(jì)報(bào)告。

    (4)程序設(shè)計(jì)題目,須提交相應(yīng)的程序,并需提供加注釋的源程序,能正常運(yùn)行。

    二、需求分析

    1、問題

    根據(jù)需求,該系統(tǒng)所應(yīng)包含的信息有以下一些:

    后臺(tái)用戶管理員的基本信息:

    賬號(hào)、密碼

    各路公交車的基本信息:

    每路公交車對(duì)應(yīng)的線路信息

    2、系統(tǒng)

    采用Python語言實(shí)現(xiàn),開發(fā)環(huán)境為PythonCharm,可以運(yùn)行在操作系統(tǒng)windows98及以上皆可。

    3、運(yùn)行要求

    界面友好,操作方便,容錯(cuò)性強(qiáng)。

    三、系統(tǒng)模塊設(shè)計(jì)

    主界面模塊:完成系統(tǒng)菜單的顯示。

    功能選擇模塊:根據(jù)用戶的選擇,完成其相應(yīng)的功能。

    線路查詢模塊:根據(jù)用戶提供的線路,查詢該線路所經(jīng)過的站點(diǎn)。

    站點(diǎn)查詢的模塊:根據(jù)用戶提供的站點(diǎn),查詢經(jīng)過該站點(diǎn)的所有線路。

    后臺(tái)管理員的模塊:后臺(tái)管理員可以進(jìn)行一些操作,例如:刪除所有線路、添加線路等

    后臺(tái)管理員的賬號(hào)系統(tǒng)管理的模塊:注冊后臺(tái)管理員的賬號(hào)和密碼。

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

    四、詳細(xì)設(shè)計(jì)

    基于Python如何制作公交車站查詢系統(tǒng)

    五、需要設(shè)計(jì)的函數(shù)

    主函數(shù)。

    管理員賬號(hào)管理界面的函數(shù)。

    用戶登錄的函數(shù)。

    后臺(tái)管理員界面的函數(shù)。

    定義修改線路的函數(shù)。

    判斷是否存在線路的函數(shù)。

    線路查詢的函數(shù)。

    判斷站點(diǎn)是否存在的函數(shù)。

    站點(diǎn)查詢的函數(shù)。

    檢查添加線路是否存在的函數(shù)。

    添加線路的函數(shù)。

    清楚所有線路的函數(shù)。

    展示所有線路的函數(shù)。

    刪除線路的函數(shù)。

    判斷是否存在線路的函數(shù)。

    展示特定線路中的站點(diǎn)的函數(shù)。

    換乘信息的函數(shù)。

    判斷線路直達(dá)的函數(shù)。

    存儲(chǔ)數(shù)據(jù)的函數(shù)。

    斷站點(diǎn)所在的線路的函數(shù)。

    六、Python源碼

    import os
    import pickle
    
    
    def main():  # 主函數(shù)
        while True:
            print('-' * 30)
            print('------菜單------')
            print('1.線路查詢')
            print('2.站點(diǎn)查詢')
            print('3.換乘信息')
            print('4.后臺(tái)管理員界面')
            print('5.管理員的賬號(hào)管理界面')
            print('6.退出程序')
            print('-' * 30)
            num = int(input('請(qǐng)選擇你的操作:\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('請(qǐng)重新做出你的選擇??!')
    
    
    def manager_account():  # 管理員賬號(hào)管理界面的函數(shù)
        def new_():
            file_path = 'D:\公交查詢系統(tǒng)\info.pkl'
            a = input('請(qǐng)?jiān)O(shè)置你的賬號(hào):')
            b = input('請(qǐng)?jiān)O(shè)置入你的密碼:')
            w = input('請(qǐng)?jiān)俅屋斎肽愕牡拿艽a:')
            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('您已經(jīng)注冊成功?。?#39;)
                else:
                    with open('info.pkl', 'wb') as fp:
                        pickle.dump(d, fp)
                    print('您已經(jīng)注冊成功??!')
            else:
                print('對(duì)不起,你兩次輸入的密碼不一致,請(qǐng)您重新輸入?。?#39;)
    
        def xiaohui():
            h = open('info.pkl', 'w+')  # 清空文件里的內(nèi)容。。。
            h.truncate()
            print('你已經(jīng)銷毀成功。。。')
    
        while True:
            print('-----管理員的賬號(hào)管理界面------\n'
                  '1.注冊\n'
                  '2.注銷原有的所有賬戶\n'
                  '3.退出管理員的賬號(hào)管理界面')
            choice = input('請(qǐng)做出你的選擇:\n')
            if choice == '1':
                new_()
            if choice == '2':
                xiaohui()
            elif choice == '3':
                print('-' * 35)
                print('------菜單------')
                print('1.線路查詢')
                print('2.站點(diǎn)查詢')
                print('3.換乘信息')
                print('4.后臺(tái)管理員界面')
                print('5.管理員的賬號(hào)管理界面')
                print('6.退出程序')
                print('-' * 35)
                break
            else:
                print('請(qǐng)重新做出你的選擇')
    
    
    def login():  # 用戶登錄的函數(shù)
        with open('info.pkl', 'rb') as fp:
            q = input('請(qǐng)輸入你的的賬號(hào):')
            w = input('請(qǐng)輸入你的的密碼:')
            while True:
                try:
                    data = pickle.load(fp)
                    if q == data['user'] and w == data['password']:
                        print('您已經(jīng)登錄成功?。?!')
                        return True
    
                except:
                    break
    
    
    def manager():  # 后臺(tái)管理員界面的函數(shù)
        if login():
            while True:
                print('-' * 30)
                print('-----后臺(tái)管理員界面-----')
                print('1.添加線路')
                print('2.刪除線路')
                print('3.修改線路')
                print('4.查看所有線路')
                print('5.刪除所有線路')
                print('6.退出')
                print('-' * 30)
                num = input('請(qǐng)做出你的選擇:\n')
                if num == '3':
                    revise_line()
                    continue
                if num == '1':
                    add_line()
                    continue
                if num == '6':
                    print('-' * 25)
                    print('------菜單------')
                    print('1.線路查詢')
                    print('2.站點(diǎn)查詢')
                    print('3.換乘信息')
                    print('4.后臺(tái)管理員界面')
                    print('5.管理員的賬號(hào)管理界面')
                    print('6.退出程序')
                    print('-' * 25)
                    break
                if num == '5':
                    clear_line_all()
                    continue
                if num == '4':
                    show_line_all()
                    continue
                if num == '2':
                    num = input('請(qǐng)輸入你要?jiǎng)h除的線路:\n').strip()
                    clear_line(num)
                    continue
                else:
                    print('請(qǐng)重新做出你的選擇...')
        else:
            print('對(duì)不起,你登錄失敗,不可以讓您進(jìn)入后臺(tái)管理員界面')
    
    
    def revise_line():  # 定義修改線路的函數(shù)
        num = input('請(qǐng)輸入您要修改的線路:').strip()
        if check_add_line(num):
            show_line_all()
            tag = input('請(qǐng)確認(rèn)是否繼續(xù)修改線路:(1為是,0為否)\n')
            if tag == '1':
                file_path = 'D:\公交查詢系統(tǒng)\line_info.pkl'
                a = input('請(qǐng)?jiān)俅屋斎胍薷牡木€路:').strip()
                clear_line(a)
                b = input('請(qǐng)輸入經(jīng)過的站點(diǎn):')
                d = {
                    a: 
                }
                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('您已經(jīng)修改線路成功!!')
                else:
                    with open('line_info.pkl', 'wb') as fp:
                        pickle.dump(d, fp)
                    print("您已經(jīng)修改線路成功了!?。?!")
        else:
            print('您要修改的線路不存在,需要?jiǎng)?chuàng)建一個(gè)新的線路。。。')
            add_line()
    
    
    def line_check(num):  # 判斷是否存在線路的函數(shù)
        with open('line_info.pkl', 'rb') as fp:
            while True:
                try:
                    data = pickle.load(fp)
                    if num in data:
                        print(f'{num}號(hào)線的路線經(jīng)過的站點(diǎn)為{data[num]}')
                        return True
                except:
                    break
    
    
    def line_find():  # 線路查詢的函數(shù)
        num = input('請(qǐng)輸入你要查詢的線路:\n').strip()
        if line_check(num):
            pass
        else:
            print('您要查找的線路不存在....')
    
    
    def site_check():  # 判斷站點(diǎn)是否存在的函數(shù)
        res = []
        with open('line_info.pkl', 'rb') as fp:
            num = input('請(qǐng)輸入你要查詢的站點(diǎn)名:\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'經(jīng)過{num}站點(diǎn)的線路為{key}號(hào)線')
                            continue
                except:
                    break
        if res:
            print(res)
            return True
        else:
            return False
    
    
    def site_find():  # 站點(diǎn)查詢的函數(shù)
        if site_check():
            pass
        else:
            print('您要查詢的站點(diǎn)不存在.....')
    
    
    def check_add_line(num):  # 檢查添加線路是否存在的函數(shù)
        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():  # 添加線路的函數(shù)
        file_path = 'D:\公交查詢系統(tǒng)\line_info.pkl'
        a = input('請(qǐng)輸入添加的線路:').strip()
        b = input('請(qǐng)輸入經(jīng)過的站點(diǎn):')
        d = {
            a: 
        }
        if os.path.exists(file_path) and os.path.getsize(file_path):
            if check_add_line(a):
                print('您要添加的線路已經(jīng)存在了......')
            else:
                with open('line_info.pkl', 'ab') as f:
                    pickle.dump(d, f)
                print('您已經(jīng)添加線路成功!!')
        else:
            with open('line_info.pkl', 'wb') as fp:
                pickle.dump(d, fp)
            print('您已經(jīng)添加線路成功了!!')
    
    
    def clear_line_all():  # 清除所有線路的函數(shù)
        h = open('line_info.pkl', 'w+')  # 清空文件里的內(nèi)容。。。
        h.truncate()
        print('你已經(jīng)銷毀成功。。。')
    
    
    def show_line_all():  # 展示所有線路的函數(shù)
        with open('line_info.pkl', 'rb') as fp:
            while True:
                try:
                    data = pickle.load(fp)
                    # 遍歷字典
                    for key, value in data.items():
                        print(f'{key}線路經(jīng)過的站點(diǎn)是{value}')
                except:
                    break
    
    
    def clear_line(num):  # 刪除線路的函數(shù)
        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}線路已經(jīng)刪除成功?。?#39;)
                            pass
                        else:
                            ls.append(data)
                except:
                    break
            save_data(ls)
    
    
    def line_check(num):  # 判斷是否存在線路的函數(shù)
        with open('line_info.pkl', 'rb') as fp:
            while True:
                try:
                    data = pickle.load(fp)
                    if num in data:
                        print(f'{num}號(hào)線的路線經(jīng)過的站點(diǎn)為{data[num]}')
                        return True
                except:
                    break
    
    
    def show_site(num):  # 展示特定線路中的站點(diǎn)的函數(shù)
        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():  # 換乘信息的函數(shù)
        begin = input('請(qǐng)輸入你的起點(diǎn)站點(diǎn):\n').strip()
        end = input('請(qǐng)輸入你的終點(diǎn)站點(diǎn):\n').strip()
        if direct_line(begin, end):
            pass
        else:
            ls = []  # 存儲(chǔ)經(jīng)過起點(diǎn)的線路的全部站點(diǎn)
            ls_ = []  # 存儲(chǔ)經(jīng)過終點(diǎn)的線路的全部站點(diǎn)
            tag = True
            data = check_site(begin, end)
            # print(type(data[0]),type(data[1]))
            print(f'經(jīng)過{begin}站點(diǎn)的線路為:{data[0]},經(jīng)過{end}站點(diǎn)的線路為{data[1]}')  # 判斷經(jīng)過起始點(diǎn)和終點(diǎn)的對(duì)應(yīng)線路
            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_):  # 判斷是否存在相同的站點(diǎn)
                            tag = False
                            print(f"您可以通過從{data[0]}號(hào)線的站轉(zhuǎn)到{data[1]}號(hào)線來到達(dá)目的地?。?quot;)
                #             break
                #         break
                #     break
                # break
            if tag:
                print('對(duì)不起,無法通過換乘來到達(dá)目的地')
    
    
    def direct_line(begin, end):  # 判斷線路直達(dá)的函數(shù)
        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}號(hào)線路直接到達(dá)')
                            return True
                except:
                    break
    
    
    def save_data(ls):  # 存儲(chǔ)數(shù)據(jù)的函數(shù)
        with open('line_info.pkl', 'wb') as fp:
            for data in ls:
                pickle.dump(data, fp)
    
    
    def check_site(begin, end):  # 判斷站點(diǎn)所在的線路的函數(shù)。
        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的五大特點(diǎn)是什么

    python的五大特點(diǎn):1.簡單易學(xué),開發(fā)程序時(shí),專注的是解決問題,而不是搞明白語言本身。2.面向?qū)ο?,與其他主要的語言如C++和Java相比, Python以一種非常強(qiáng)大又簡單的方式實(shí)現(xiàn)面向?qū)ο缶幊獭?.可移植性,Python程序無需修改就可以在各種平臺(tái)上運(yùn)行。4.解釋性,Python語言寫的程序不需要編譯成二進(jìn)制代碼,可以直接從源代碼運(yùn)行程序。5.開源,Python是 FLOSS(自由/開放源碼軟件)之一。

    關(guān)于基于Python如何制作公交車站查詢系統(tǒng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI