python公交查询系统
python公交查询系统
公交查询系统实验可以实现一个方便、快捷的公交信息查询方式。要求实现以下功能:1.线路查询:可以获得要查询公交所通过的各个站点;2.站点查询:通过输入的指定站点查询经过该站点的公交;3.换乘查询:分为公交直达、公交一次换乘,主要体现那些不可直达需要转车的路线的所有换乘方法;4.后台管理:用于管理员登入,添加、修改、删除公交线路等功能。
- 本系统用字典实现,key对应公交车号,value对应路线列表
- 换乘功能只能找到直达和换乘一次的情况
- 不是很完美,望大佬评论指出意见
'''
管理员密码:1
注意点:
1.公交车号唯一
修改key
dict={'a':1, 'b':2}
dict["c"] = dict.pop("a")
判断key是否存在
num in dict.key()
2.添加完成保存到文件
'''
import os
path=[]#存储站点
bus={'001':['a','b','e'],'002':['b','c','g'],'003':['h','c','d']}#存储公交路线,初始化3条路线
#线路查询功能
def linefind():
num=input("请输入要查询的公交车号:")
if num not in bus.keys():
print("没有该线路信息,查询失败")
return False
for b,r in bus.items():
if(num==b):
print("该公交车的线路为:",r)
return True
#站点查询功能
def addrfind(addr):
tmp=[]
#addr=input("请输入要查询的站点名称")
for b,r in bus.items():
if addr in r:
tmp.append(b)
if( not tmp):
print("对不起,此站点没有公交车经过")
return tmp
return tmp
#换乘查询
def change():
startaddr=input("请输入出发地:")
slist=addrfind(startaddr)#经过出发地的公交车
if( not slist):
print("请您移步到有站点的出发地再进行查询")
return False
desaddr=input("请输入目的地:")
if( not desaddr):
print("请您选择离您目的地最近的公交车站点")
dlist=addrfind(desaddr)#经过目的地的公交车
x=len(slist)
y=len(dlist)
#直达查询
tmp=listlis(slist,dlist)
if tmp:
print("您可以乘坐",slist[tmp[0]],"号公交车直达")
return True
for i in range(0,x):
for j in range(0,y):
index=listlis(bus[slist[i]],bus[dlist[j]])
#判断是否存在相交路径
if index:
ls=lenrouds(slist[i],startaddr,index[0])
ld=lenrouds(dlist[j],desaddr,index[1])
print("您可以乘坐",slist[i],"号公交车经过",ls,"站到达",bus[slist[i]][index[0]],end="")
print("站后转乘",dlist[j],"号公交车经过",ld,"站到达目的地")
return True
print("对不起,没有直达和一次转乘到达的车")
return False
#返回线路长度
def lenrouds(busnum,startaddr,end):
tmp=bus[busnum]
for i in range(0,len(tmp)):
if tmp[i]==startaddr:
if i<end:
return end-i
else:
return i-end
#返回两个列表中相同元素的位置
def listlis(slist,dlist):
x=len(slist)
y=len(dlist)
tmp=[]
for i in range(0,x):
for j in range(0,y):
if(slist[i]==dlist[j]):
tmp.append(i)
tmp.append(j)
return tmp
return tmp
#后台管理显示界面
def backstage():
print("温馨提示:密码可在源码第一行查看")
pwd=input("请输入管理员密码:")
if pwd!="1":
print("密码输入有误,已退出!")
return False
print("登录成功,欢迎进入公交系统后台管理")
checkrouds()
while True:
print("-"*10,"菜单","-"*10)
print("1.增加线路")
print("2.删除线路")
print("3.修改线路")
print("4.退出管理")
num=input("请输入你的选择:")
if num=='1':
addline()
elif num=='2':
delrouds()
elif num=='3':
changerouds()
elif num=='4':
print("已退出")
break
else:
print("输入有误,重新输入")
#添加线路信息
def addline():
i=1
busnum=input("请输入添加的公交车号:")
if busnum in bus.keys():
print("此公交车已存在,无法添加!")
return False
print("请输入此公交经过的站点(拼'stop'结束输入):")
while True:
print("请输入此公交车经过的第",i,"个站点:")
addr=input()
i+=1
if addr=='stop':
break
path.append(addr)
bus[busnum]=path
writebus()
print("保存成功")
#删除线路
def delrouds():
print("全部删除或输入公交号删除?(y/n):")
while True:
r=input()
if r=='y'or r=='Y':
bus.clear()
writebus()
print("删除成功")
return True
elif r=='n' or r=='N':
break
else:
print("请输入y或n")
busnum=input("请输入删除的公交车号:")
if busnum not in bus.keys():
print("此公交车不存在,无法删除!")
return False
del bus[busnum]
print("删除成功")
writebus()
print("保存成功")
#修改线路
def changerouds():
busnum=input("请输入添加的公交车号:")
if busnum not in bus.keys():
print("此公交车不存在,无法修改!")
return False
print("请重新输入此公交经过的站点(拼'stop'结束输入):")
while True:
addr=input()
if addr=='stop':
print("修改成功!")
break
path.append(addr)
bus[busnum]=path
writebus()
print("保存成功")
#保存到文件
def writebus():
with open('bus.txt','w') as f:
f.write(str(bus))
f.close()
#读出文件
def readbus():
if os.path.exists('bus.txt'):
with open('bus.txt','r+') as f:
busa=eval(f.read())#注意此处为深复制相当于又新开辟了一个空间
bus.update(busa)#以busa为准进行更新
f.close()
print("信息已加载")
else:
print("没有信息加载失败")
#查看所有线路
def checkrouds():
if not bus:
print("对不起,当前无线路信息")
return False
print("所有线路信息如下:")
#print("*"*60)
print("公交车号\t经过车站")
print("*"*60)
for i,j in bus.items():
print(i,"\t\t",j)
print("*"*60)
def main():
print("欢迎来到公交查询系统")
while True:
print("-"*10,"菜单","-"*10)
print("1.线路查询")
print("2.站点查询")
print("3.换乘查询")
print("4.后台管理")
print("5.查看所有线路")
print("6.退出程序")
print("*"*22)
readbus()
writebus()
num=input("请输入你的选择:")
if num=='1':
linefind()
elif num=='2':
addr=input("请输入要查询的站点名称")
tmp=addrfind(addr)
if(tmp):
print("该站点经过的公交车有:",tmp)
elif num=='3':
change()
elif num=='4':
backstage()
elif num=='5':
checkrouds()
elif num=='6':
print("已退出")
break
else:
print("输入有误,请重新输入")
main()