Python课设实验 之 公交查询系统.(文本导入 字典树 储存.)

 要求:

目录

 要求:


第1题  编写一个公交查询系统

随着公交系统的庞大,人们很难得到准确的公交信息,这样给人们的出行就带来了不便。因此,急需一个方便、快捷的公交信息查询方式,本系统提供换乘询功能、路线查询功能。乘客可以方便的进行查询,以防乘错车次。主要有4个模块:线路查询、站点查询、换乘查询和后台管理模块。

(1)线路查询:可以获得要查询公交所通过的各个站点。

(2)站点查询:通过输入的指定站点查询经过该站点的公交。

(3)换乘查询:分为公交直达、公交一次换乘,主要体现那些不可直达需要转车的路线的所有换乘方法。

(4)后台管理:用于管理员登录,添加、修改、删除公交线路等功能。

程序需要存储各公交线路站点信息,这里采用文件存储线路信息,形式如下:

1s%通利公交公司%长途客运西站%建设路国棉六厂%建设路桐柏路站%建设路文化宫路站%建设路工人路站%碧沙岗公园西门%绿城广场%嵩山路伊河路站%解放军测绘学院%市骨科医院%陇海路路寨%陇海路京广客运站%陇海路铁英街站%郑州铁路局%锦荣商贸城%福寿街大同路站%火车站%6:00-21:00 票价1元 ABCD卡有效

1x%火车站%一马路陇海路站%郑州铁路局%陇海路铁英街站%陇海路京广客运站%陇海路路寨%市骨科医院%解放军测绘学院%嵩山路伊河路站%绿城广场%碧沙岗公园西门%碧沙岗%建设路工人路站%建设路文化宫路站%建设路桐柏路站%建设路国棉六厂%华山路建设路站%通利公交公司%6:00-21:00 票价1元 ABCD卡有效

……

其中1s为上行,1x为下行。站点信息之间%分割。

提示:

公交查询系统程序从文件中读取线路信息,其中线路信息存入rote 字典中,线路名存入rotename列表中。rote 字典存储形式为{线路名:线路经过站点的列表}。

例如以上线路信息存入rote 字典时键名为线路名1s,键对应内容为1s线路经过站点的列表:

print(rote['1s'])

print(rote['1x'])

结果如下:

['通利公交公司', '长途客运西站', '建设路国棉六厂', '建设路桐柏路站', '建设路文化宫路站', '建设路工人路站', '碧沙岗公园西门', '绿城广场', '嵩山路伊河路站', '解放军测绘学院', '市骨科医院', '陇海路路寨', '陇海路京广客运站', '陇海路铁英街站', '郑州铁路局', '锦荣商贸城', '福寿街大同路站', '火车站']

['火车站', '一马路陇海路站', '郑州铁路局', '陇海路铁英街站', '陇海路京广客运站', '陇海路路寨', '市骨科医院', '解放军测绘学院', '嵩山路伊河路站', '绿城广场', '碧沙岗公园西门', '碧沙岗', '建设路工人路站', '建设路文化宫路站', '建设路桐柏路站', '建设路国棉六厂', '华山路建设路站', '通利公交公司']

当线路信息存入rote 字典后,线路查询、站点查询、换乘功能实现就可转换为对rote 字典的相应操作。

程序应采用模块化设计,主函数是程序入口,各模块独立,可分块调试,各模块由主函数控制调用。编写主菜单函数,返回相应的功能选项数字,主函数根据此数字调用相应的功能函数。编写各功能模块函数。最后进行综合调试。

将公交信息存储到数据库实现加分。

 大致思路:

通过模块化程序来编写一个个函数来分别实现题目要求的功能.

信息由txt文档导入,存储在字典树中,key为公交线路名,value为该线路经过的各个站点以及该线路的车票价格.

公交路线文本下载地址:

gongjiao.txt-其它文档类资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/kilig_CSM/54031169

代码:

t = open("gongjiao.txt", 'r')
zidian = {}

while True:
    informationlin = t.readline()  # 本列信息.
    if informationlin == '':
        break
    num_star = int(informationlin.find("%"))  # 第一个百分号位置
    num_end = -99999  # 最后一个%位置
    for j in range(0, len(informationlin)):
        if informationlin[len(informationlin) - j - 1] == "%":
            num_end = len(informationlin) - j - 1
            break
    #   print(num_end)
    jian = informationlin[:int(num_star)]  # 字典树关键字.
   # print(jian)
    # print(informationlin[num_star+1:num_end])
    liebiao = informationlin[num_star + 1:num_end].split('%')
   # print(liebiao)
    zidian[jian] = liebiao
t.close()


def xianlu_find(information_xianlu):
  print(zidian[information_xianlu])

def get_key1(dct, value):
   # print(value)
    #print(dct)
    print(list(filter(lambda k: dct[k] == value, dct)))

def zhandian_find(name_zhandian):
    linshi=[]
 # print(name_zhandian)
    for i in zidian.keys():
      for j in range(0, len(zidian[i])):
          if zidian[i][j] == name_zhandian:
              linshi.append(i)
    return  linshi

def tianjia():
    t = open("gongjiao.txt", 'a+')
    jian_tianjia = input("请输入想要添加的路线名:")
    zhandian_tianjia = []
    while True:
        zhandian_tianjia_right = input("请输入该路线想要添加的站点的名称(每行输入一个站点,若想停止输入则输入-99.)")
        if zhandian_tianjia_right == '-99':
            break
        else:
            zhandian_tianjia.append(zhandian_tianjia_right)
    t.write(jian_tianjia)
    t.write('%')
    for i in range(0, len(zhandian_tianjia)):
        t.write(zhandian_tianjia[i])
        t.write("%")
    tianjia_stat_time = input("请输入该路线开始时间(格式为xx:xx):")
    tianjia_finish_time = input("请输入该路线结束时间(格式为xx:xx):")
    t.write(tianjia_stat_time + '-' + tianjia_finish_time)
    tianjia_money = input('请输入该路线车票价格(格式为:x元):')
    t.write(' ' + tianjia_money + ' ')
    tianjia_ka = input("请输入有效卡:")
    t.write(tianjia_ka + '卡有效')

def shanchu():
    t = open("gongjiao.txt", 'r')
    information = t.read()
    del_xianlu = input("请输入你要删除的线路的名称:")
    del_start = information.find(del_xianlu)
    del_finish = information.find('卡有效', del_start)
    # print(information[0:del_start])
    information_re = information[0:del_start] + information[del_finish + 4:len(information)]
    print(information_re)
    t.close()
    t = open("实验.txt", 'w')
    t.write(information_re)
    t.close()

def xiugai():
    shanchu()
    tianjia()

def houtai():
    print('1.添加')
    print('2.修改')
    print('3.删除')
    num_houtai=input('请输入您想要进行的操作的序列号:')
    if num_houtai == 1 :
        tianjia()
    elif num_houtai == 2 :
        xiugai()
    else:
        shanchu()

def xiangtong_find(start_xiangtong,finish_xiangtong):
    start = []  ##出发点路线
    finish = []  # 结束站路线
    for i in zidian.keys():  # 将所有的拥有起始站的线路找出
        for j in range(0, len(zidian[i])):
            if zidian[i][j] == start_xiangtong:
                start.append(i)
    for i in zidian.keys():  # 将所有拥有终点站的线路找出
        for j in range(0, len(zidian[i])):
            if zidian[i][j] == finish_xiangtong:
                finish.append(i)
    end_0 = []  ##存放起点和终点在同一条路的路线名
    for i in range(0, len(start)):
        for j in range(0, len(finish)):
            if start[i] == finish[j]:
                end_0.append(start[i])
                break
    return end_0
def huancheng_find(zhandian_start,zhandian_finish):
    end_0=[]
    start = []  ##出发点路线
    finish = []  # 结束站路线
    for i in zidian.keys():  # 将所有的拥有起始站的线路找出
        for j in range(0, len(zidian[i])):
            if zidian[i][j] == zhandian_start:
                start.append(i)
    for i in zidian.keys():  # 将所有拥有终点站的线路找出
        for j in range(0, len(zidian[i])):
            if zidian[i][j] == zhandian_finish:
                finish.append(i)
    xiangtong_find(zhandian_start,zhandian_finish)
    if end_0!= []:#不用换乘可直达.
        end_ringt = []  # 将所有该路线上的站点加入该列表
        for i in range(0, len(end_0)):  # 遍历每个路线
            start_id = int(9999)
            finish_id = int(-9999)
            for j in range(0, len(zidian[end_0[i]])):  # 遍历每个路线中的每个站点
                if zidian[end_0[i]][j] == zhandian_start:
                    start_id = j
                elif zidian[end_0[i]][j] == zhandian_finish:
                    finish_id = j
                if start_id <= finish_id:
                  end_ringt.append(end_0[i] + '线路')
                  for j in range(start_id, finish_id + 1):
                    end_ringt.append(zidian[end_0[i]][j])
                  break

        return end_ringt
    else:  # 当起始站点的路线和终点的路线没有相同的时需要换乘.可以先找出发点的所有站点能够连接目的站点的路线的站点再打印出来.
        end_right=[]
        for i in  range (0,len(start)):#起始站点相同的路线start[i]
           for j in range(0, len(zidian[start[i]])):#zidian[start[i]][j]路线对应的站点即目的站点对应的能达到站点
                zhuanchengluxian = xiangtong_find(zidian[start[i]][j], zhandian_finish)
                if zhuanchengluxian !=[]:
                    for m in  range(0,len(zhuanchengluxian)):
                        print(start[i] + zhandian_start + '到' + zidian[start[i]][j] + '换乘' + zhuanchengluxian[m]+zidian[start[i]][j]+'-'+zhandian_finish)
        return []

while True:
    print("1.(1)线路查询:可以获得要查询公交所通过的各个站点。")
    print("2.(2)站点查询:通过输入的指定站点查询经过该站点的公交。")
    print("3.(3)换乘查询:分为公交直达、公交一次换乘,主要体现那些不可直达需要转车的路线的所有换乘方法。")
    print("4.(4)后台管理:用于管理员登录,添加、修改、删除公交线路等功能。")
    print("5.(5)退出程序.")
    num=input("请输入你想要执行的操作的序列号:")
    if(num=='1'):
        information_xianlu=input("请输入你要查询的线路:")
        xianlu_find(information_xianlu)
    elif(num=='2'):
        name_zhandian = input("请输入你要搜索的站点:")
        print(zhandian_find(name_zhandian))
    elif (num == '3'):
        zhandian_start = input("请输入你所在站点:")
        zhandian_finish = input("请输入你想要到达的站点:")
        if huancheng_find(zhandian_start,zhandian_finish)!=[]:
            print(huancheng_find(zhandian_start, zhandian_finish))

    elif (num == '4'):
        houtai()
    elif (num == '5'):
        break

一些比较关键的语句后跟的有注释以方便大家理解.

本实验具体内容于:

Python课设实验报告.docx-讲义文档类资源-CSDN文库

(本报告包含课设目的,开发环境,课设内容,需求分析,设计过程,存储方式,过程及代码,调试过程,小结,参考文献.) 

题外话(吐槽):

本着资源共享的想法让更多因课设而苦恼的同学更加方便的完成课设,于是我上传了这篇博客以供大家参考.结果就在我上传题目时忽然发现题目最后有一句“将公交信息存储到数据库实现加分

人麻了,可惜离交课设的时间快到了没时间再改了.就只能这样了.

还有就是第三个功能实现的时候本来是使用了递归实现,但没想到的是pycharm报错说超出递归上线,第一次知道递归还有上限,之前用c从来没遇见过递归上线,感觉涨芝士了,之后改变思路重新实现该功能.

更多内容请关注:

Python课设实验 之 公交查询系统.(文本导入 字典树 储存.)-CSDN社区

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月半明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值