基於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!
推薦閱讀:
- Python開發技巧之海象運算符的三種運用方式
- Python函數裝飾器的使用詳解
- Python序列化模塊之pickle與json詳解
- Python常用標準庫詳解(pickle序列化和JSON序列化)
- Python3 pickle模塊的使用方法詳細介紹