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()