基于Python制作公交車(chē)站查詢(xún)系統(tǒng)
一、設(shè)計(jì)目的
1、教學(xué)目的
本課程設(shè)計(jì)是學(xué)生學(xué)習(xí)完《Python程序設(shè)計(jì)》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,通過(guò)課程設(shè)計(jì),更好地掌握使用Python語(yǔ)言進(jìn)行程序設(shè)計(jì)的方法,加深對(duì)Python語(yǔ)言特點(diǎn)和使用Python語(yǔ)言進(jìn)行程序設(shè)計(jì)開(kāi)發(fā)過(guò)程的理解,加強(qiáng)動(dòng)手能力。其主要目的是:
(1)進(jìn)一步培養(yǎng)學(xué)生Python程序設(shè)計(jì)的思想,加深對(duì)高級(jí)語(yǔ)言基本語(yǔ)言要素和控制結(jié)構(gòu)的理解;
(2)針對(duì)Python語(yǔ)言中的重點(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語(yǔ)言的編程技巧和上機(jī)調(diào)試程序的方法。
(4)掌握程序設(shè)計(jì)的常用算法。
2、教學(xué)要求
(1)要求從所給題目中任選若干個(gè),每個(gè)學(xué)生必須獨(dú)立完成課程設(shè)計(jì),不能互相抄襲。
(2)設(shè)計(jì)完成后,對(duì)所完成的工作進(jìn)行答辯。
(3)要求寫(xiě)出一份詳細(xì)的課程設(shè)計(jì)報(bào)告。
(4)程序設(shè)計(jì)題目,須提交相應(yīng)的程序,并需提供加注釋的源程序,能正常運(yùn)行。
二、需求分析
1、問(wèn)題
根據(jù)需求,該系統(tǒng)所應(yīng)包含的信息有以下一些:
后臺(tái)用戶(hù)管理員的基本信息:
賬號(hào)、密碼
各路公交車(chē)的基本信息:
每路公交車(chē)對(duì)應(yīng)的線路信息
2、系統(tǒng)
采用Python語(yǔ)言實(shí)現(xiàn),開(kāi)發(fā)環(huán)境為PythonCharm,可以運(yùn)行在操作系統(tǒng)windows98及以上皆可。
3、運(yùn)行要求
界面友好,操作方便,容錯(cuò)性強(qiáng)。
三、系統(tǒng)模塊設(shè)計(jì)
主界面模塊:完成系統(tǒng)菜單的顯示。
功能選擇模塊:根據(jù)用戶(hù)的選擇,完成其相應(yīng)的功能。
線路查詢(xún)模塊:根據(jù)用戶(hù)提供的線路,查詢(xún)?cè)摼€路所經(jīng)過(guò)的站點(diǎn)。
站點(diǎn)查詢(xún)的模塊:根據(jù)用戶(hù)提供的站點(diǎn),查詢(xún)經(jīng)過(guò)該站點(diǎn)的所有線路。
后臺(tái)管理員的模塊:后臺(tái)管理員可以進(jìn)行一些操作,例如:刪除所有線路、添加線路等
后臺(tái)管理員的賬號(hào)系統(tǒng)管理的模塊:注冊(cè)后臺(tái)管理員的賬號(hào)和密碼。
換乘信息的模塊:根據(jù)用戶(hù)提供的起點(diǎn)和終點(diǎn),幫助用戶(hù)找到最便捷的路線。
四、詳細(xì)設(shè)計(jì)
五、需要設(shè)計(jì)的函數(shù)
主函數(shù)。
管理員賬號(hào)管理界面的函數(shù)。
用戶(hù)登錄的函數(shù)。
后臺(tái)管理員界面的函數(shù)。
定義修改線路的函數(shù)。
判斷是否存在線路的函數(shù)。
線路查詢(xún)的函數(shù)。
判斷站點(diǎn)是否存在的函數(shù)。
站點(diǎn)查詢(xú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.線路查詢(xún)') print('2.站點(diǎn)查詢(xú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:\公交查詢(xún)系統(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)注冊(cè)成功?。?) else: with open('info.pkl', 'wb') as fp: pickle.dump(d, fp) print('您已經(jīng)注冊(cè)成功??!') else: print('對(duì)不起,你兩次輸入的密碼不一致,請(qǐng)您重新輸入?。?) def xiaohui(): h = open('info.pkl', 'w+') # 清空文件里的內(nèi)容。。。 h.truncate() print('你已經(jīng)銷(xiāo)毀成功。。。') while True: print('-----管理員的賬號(hào)管理界面------\n' '1.注冊(cè)\n' '2.注銷(xiāo)原有的所有賬戶(hù)\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.線路查詢(xún)') print('2.站點(diǎn)查詢(xún)') print('3.換乘信息') print('4.后臺(tái)管理員界面') print('5.管理員的賬號(hào)管理界面') print('6.退出程序') print('-' * 35) break else: print('請(qǐng)重新做出你的選擇') def login(): # 用戶(hù)登錄的函數(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.線路查詢(xún)') print('2.站點(diǎn)查詢(xú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:\公交查詢(xún)系統(tǒng)\line_info.pkl' a = input('請(qǐng)?jiān)俅屋斎胍薷牡木€路:').strip() clear_line(a) b = input('請(qǐng)輸入經(jīng)過(guò)的站點(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)過(guò)的站點(diǎn)為{data[num]}') return True except: break def line_find(): # 線路查詢(xún)的函數(shù) num = input('請(qǐng)輸入你要查詢(xún)的線路:\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)輸入你要查詢(xún)的站點(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)過(guò){num}站點(diǎn)的線路為{key}號(hào)線') continue except: break if res: print(res) return True else: return False def site_find(): # 站點(diǎn)查詢(xún)的函數(shù) if site_check(): pass else: print('您要查詢(xún)的站點(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:\公交查詢(xún)系統(tǒng)\line_info.pkl' a = input('請(qǐng)輸入添加的線路:').strip() b = input('請(qǐng)輸入經(jīng)過(guò)的站點(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)銷(xiāo)毀成功。。。') 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)過(guò)的站點(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)刪除成功!!') 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)過(guò)的站點(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)過(guò)起點(diǎn)的線路的全部站點(diǎn) ls_ = [] # 存儲(chǔ)經(jīng)過(guò)終點(diǎn)的線路的全部站點(diǎn) tag = True data = check_site(begin, end) # print(type(data[0]),type(data[1])) print(f'經(jīng)過(guò){begin}站點(diǎn)的線路為:{data[0]},經(jīng)過(guò){end}站點(diǎn)的線路為{data[1]}') # 判斷經(jīng)過(guò)起始點(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"您可以通過(guò)從{data[0]}號(hào)線的站轉(zhuǎn)到{data[1]}號(hào)線來(lái)到達(dá)目的地?。?) # break # break # break # break if tag: print('對(duì)不起,無(wú)法通過(guò)換乘來(lái)到達(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'您可以通過(guò){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()
七、運(yùn)行效果
到此這篇關(guān)于基于Python制作公交車(chē)站查詢(xún)系統(tǒng)的文章就介紹到這了,更多相關(guān)Python公交車(chē)站查詢(xún)系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息
這篇文章主要介紹了基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06python創(chuàng)建與遍歷List二維列表的方法
這篇文章主要介紹了python創(chuàng)建與遍歷List二維列表的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08Python解決N階臺(tái)階走法問(wèn)題的方法分析
這篇文章主要介紹了Python解決N階臺(tái)階走法問(wèn)題的方法,簡(jiǎn)單描述了走臺(tái)階問(wèn)題,并結(jié)合實(shí)例形式分析了Python使用遞歸與遞推算法解決走臺(tái)階問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Python函數(shù)默認(rèn)參數(shù)常見(jiàn)問(wèn)題及解決方案
這篇文章主要介紹了Python函數(shù)默認(rèn)參數(shù)常見(jiàn)問(wèn)題及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Python 多進(jìn)程和數(shù)據(jù)傳遞的理解
這篇文章主要介紹了Python 多進(jìn)程和數(shù)據(jù)傳遞的理解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10Python?selenium?find_element()示例詳解
selenium定位元素的函數(shù)/方法可以分為兩類(lèi):find_element及find_elements,下面這篇文章主要給大家介紹了關(guān)于Python?selenium?find_element()的相關(guān)資料,需要的朋友可以參考下2022-07-07