基于Python制作公交車站查詢系統(tǒng)
一、設計目的
1、教學目的
本課程設計是學生學習完《Python程序設計》課程后,進行的一次全面的綜合訓練,通過課程設計,更好地掌握使用Python語言進行程序設計的方法,加深對Python語言特點和使用Python語言進行程序設計開發(fā)過程的理解,加強動手能力。其主要目的是:
(1)進一步培養(yǎng)學生Python程序設計的思想,加深對高級語言基本語言要素和控制結構的理解;
(2)針對Python語言中的重點和難點內(nèi)容進行訓練,獨立完成有一定工作量的程序設計任務,同時強調好的程序設計風格。
(3)掌握Python語言的編程技巧和上機調試程序的方法。
(4)掌握程序設計的常用算法。
2、教學要求
(1)要求從所給題目中任選若干個,每個學生必須獨立完成課程設計,不能互相抄襲。
(2)設計完成后,對所完成的工作進行答辯。
(3)要求寫出一份詳細的課程設計報告。
(4)程序設計題目,須提交相應的程序,并需提供加注釋的源程序,能正常運行。
二、需求分析
1、問題
根據(jù)需求,該系統(tǒng)所應包含的信息有以下一些:
后臺用戶管理員的基本信息:
賬號、密碼
各路公交車的基本信息:
每路公交車對應的線路信息
2、系統(tǒng)
采用Python語言實現(xiàn),開發(fā)環(huán)境為PythonCharm,可以運行在操作系統(tǒng)windows98及以上皆可。
3、運行要求
界面友好,操作方便,容錯性強。
三、系統(tǒng)模塊設計
主界面模塊:完成系統(tǒng)菜單的顯示。
功能選擇模塊:根據(jù)用戶的選擇,完成其相應的功能。
線路查詢模塊:根據(jù)用戶提供的線路,查詢該線路所經(jīng)過的站點。
站點查詢的模塊:根據(jù)用戶提供的站點,查詢經(jīng)過該站點的所有線路。
后臺管理員的模塊:后臺管理員可以進行一些操作,例如:刪除所有線路、添加線路等
后臺管理員的賬號系統(tǒng)管理的模塊:注冊后臺管理員的賬號和密碼。
換乘信息的模塊:根據(jù)用戶提供的起點和終點,幫助用戶找到最便捷的路線。
四、詳細設計

五、需要設計的函數(shù)
主函數(shù)。
管理員賬號管理界面的函數(shù)。
用戶登錄的函數(shù)。
后臺管理員界面的函數(shù)。
定義修改線路的函數(shù)。
判斷是否存在線路的函數(shù)。
線路查詢的函數(shù)。
判斷站點是否存在的函數(shù)。
站點查詢的函數(shù)。
檢查添加線路是否存在的函數(shù)。
添加線路的函數(shù)。
清楚所有線路的函數(shù)。
展示所有線路的函數(shù)。
刪除線路的函數(shù)。
判斷是否存在線路的函數(shù)。
展示特定線路中的站點的函數(shù)。
換乘信息的函數(shù)。
判斷線路直達的函數(shù)。
存儲數(shù)據(jù)的函數(shù)。
斷站點所在的線路的函數(shù)。
六、Python源碼
import os
import pickle
def main(): # 主函數(shù)
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(): # 管理員賬號管理界面的函數(shù)
def new_():
file_path = 'D:\公交查詢系統(tǒng)\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('您已經(jīng)注冊成功??!')
else:
with open('info.pkl', 'wb') as fp:
pickle.dump(d, fp)
print('您已經(jīng)注冊成功?。?)
else:
print('對不起,你兩次輸入的密碼不一致,請您重新輸入??!')
def xiaohui():
h = open('info.pkl', 'w+') # 清空文件里的內(nèi)容。。。
h.truncate()
print('你已經(jīng)銷毀成功。。。')
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(): # 用戶登錄的函數(shù)
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('您已經(jīng)登錄成功?。。?)
return True
except:
break
def manager(): # 后臺管理員界面的函數(shù)
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(): # 定義修改線路的函數(shù)
num = input('請輸入您要修改的線路:').strip()
if check_add_line(num):
show_line_all()
tag = input('請確認是否繼續(xù)修改線路:(1為是,0為否)\n')
if tag == '1':
file_path = 'D:\公交查詢系統(tǒng)\line_info.pkl'
a = input('請再次輸入要修改的線路:').strip()
clear_line(a)
b = input('請輸入經(jīng)過的站點:')
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('您要修改的線路不存在,需要創(chuàng)建一個新的線路。。。')
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}號線的路線經(jīng)過的站點為{data[num]}')
return True
except:
break
def line_find(): # 線路查詢的函數(shù)
num = input('請輸入你要查詢的線路:\n').strip()
if line_check(num):
pass
else:
print('您要查找的線路不存在....')
def site_check(): # 判斷站點是否存在的函數(shù)
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'經(jīng)過{num}站點的線路為{key}號線')
continue
except:
break
if res:
print(res)
return True
else:
return False
def site_find(): # 站點查詢的函數(shù)
if site_check():
pass
else:
print('您要查詢的站點不存在.....')
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('請輸入添加的線路:').strip()
b = input('請輸入經(jīng)過的站點:')
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)過的站點是{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}號線的路線經(jīng)過的站點為{data[num]}')
return True
except:
break
def show_site(num): # 展示特定線路中的站點的函數(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('請輸入你的起點站點:\n').strip()
end = input('請輸入你的終點站點:\n').strip()
if direct_line(begin, end):
pass
else:
ls = [] # 存儲經(jīng)過起點的線路的全部站點
ls_ = [] # 存儲經(jīng)過終點的線路的全部站點
tag = True
data = check_site(begin, end)
# print(type(data[0]),type(data[1]))
print(f'經(jīng)過{begin}站點的線路為:{data[0]},經(jīng)過{end}站點的線路為{data[1]}') # 判斷經(jī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_): # 判斷是否存在相同的站點
tag = False
print(f"您可以通過從{data[0]}號線的站轉到{data[1]}號線來到達目的地!!")
# break
# break
# break
# break
if tag:
print('對不起,無法通過換乘來到達目的地')
def direct_line(begin, end): # 判斷線路直達的函數(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}號線路直接到達')
return True
except:
break
def save_data(ls): # 存儲數(shù)據(jù)的函數(shù)
with open('line_info.pkl', 'wb') as fp:
for data in ls:
pickle.dump(data, fp)
def check_site(begin, end): # 判斷站點所在的線路的函數(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制作公交車站查詢系統(tǒng)的文章就介紹到這了,更多相關Python公交車站查詢系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python創(chuàng)建與遍歷List二維列表的方法
這篇文章主要介紹了python創(chuàng)建與遍歷List二維列表的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08
Python函數(shù)默認參數(shù)常見問題及解決方案
這篇文章主要介紹了Python函數(shù)默認參數(shù)常見問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
Python?selenium?find_element()示例詳解
selenium定位元素的函數(shù)/方法可以分為兩類:find_element及find_elements,下面這篇文章主要給大家介紹了關于Python?selenium?find_element()的相關資料,需要的朋友可以參考下2022-07-07

