基于Python制作公交车站查询系统

作者:Kinght_123 时间:2022-10-03 04:34:03 

一、设计目的

1、教学目的

本课程设计是学生学习完《Python程序设计》课程后,进行的一次全面的综合训练,通过课程设计,更好地掌握使用Python语言进行程序设计的方法,加深对Python语言特点和使用Python语言进行程序设计开发过程的理解,加强动手能力。其主要目的是:

(1)进一步培养学生Python程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;

(2)针对Python语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

(3)掌握Python语言的编程技巧和上机调试程序的方法。

(4)掌握程序设计的常用算法。

2、教学要求

(1)要求从所给题目中任选若干个,每个学生必须独立完成课程设计,不能互相抄袭。

(2)设计完成后,对所完成的工作进行答辩。

(3)要求写出一份详细的课程设计报告。

(4)程序设计题目,须提交相应的程序,并需提供加注释的源程序,能正常运行。

二、需求分析

1、问题

根据需求,该系统所应包含的信息有以下一些:

后台用户管理员的基本信息:

账号、密码

各路公交车的基本信息:

每路公交车对应的线路信息

2、系统

采用Python语言实现,开发环境为PythonCharm,可以运行在操作系统windows98及以上皆可。

3、运行要求

界面友好,操作方便,容错性强。

三、系统模块设计

主界面模块:完成系统菜单的显示。

功能选择模块:根据用户的选择,完成其相应的功能。

线路查询模块:根据用户提供的线路,查询该线路所经过的站点。

站点查询的模块:根据用户提供的站点,查询经过该站点的所有线路。

后台管理员的模块:后台管理员可以进行一些操作,例如:删除所有线路、添加线路等

后台管理员的账号系统管理的模块:注册后台管理员的账号和密码。

换乘信息的模块:根据用户提供的起点和终点,帮助用户找到最便捷的路线。

四、详细设计

基于Python制作公交车站查询系统

五、需要设计的函数

主函数。

管理员账号管理界面的函数。

用户登录的函数。

后台管理员界面的函数。

定义修改线路的函数。

判断是否存在线路的函数。

线路查询的函数。

判断站点是否存在的函数。

站点查询的函数。

检查添加线路是否存在的函数。

添加线路的函数。

清楚所有线路的函数。

展示所有线路的函数。

删除线路的函数。

判断是否存在线路的函数。

展示特定线路中的站点的函数。

换乘信息的函数。

判断线路直达的函数。

存储数据的函数。

断站点所在的线路的函数。

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

七、运行效果

视频链接

来源:https://blog.csdn.net/Kinght_123/article/details/115285636

标签:Python,公交,查询
0
投稿

猜你喜欢

  • SQL Server 比较日期大小的方法

    2024-01-22 16:03:03
  • php使用composer常见问题及解决办法

    2023-07-10 13:54:53
  • 在Python的Django框架中创建语言文件

    2023-05-06 09:54:21
  • Pygame游戏开发之太空射击实战子弹与碰撞处理篇

    2022-05-24 03:59:19
  • node+koa实现数据mock接口的方法

    2024-05-09 14:49:31
  • JS和函数式语言的三特性

    2024-04-17 10:10:57
  • 用XMlhttp生成html页面

    2007-08-29 19:49:00
  • PyCharm专业最新版2019.1安装步骤(含激活码)

    2022-10-21 19:56:06
  • 浅谈Python中的数据类型

    2022-11-29 06:19:22
  • Python重新加载模块的实现方法

    2021-07-05 16:05:18
  • 在 Python 中进行 One-Hot 编码

    2023-04-06 06:02:55
  • Python详解argparse参数模块之命令行参数

    2021-06-20 21:16:18
  • MySQL数据库优化技术之配置技巧总结

    2024-01-19 18:13:08
  • Python实现的读取/更改/写入xml文件操作示例

    2023-06-05 05:16:42
  • textarea的输入限制统计代码statInput

    2008-05-22 13:36:00
  • Golang Goroutine的使用

    2023-09-20 20:38:45
  • Python实现批量生成,重命名和删除word文件

    2022-12-03 05:51:33
  • Python3模拟登录操作实例分析

    2022-01-18 13:36:26
  • GO语言映射(Map)用法分析

    2024-04-28 09:17:53
  • Python_查看sqlite3表结构,查询语句的示例代码

    2021-01-24 22:35:06
  • asp之家 网络编程 m.aspxhome.com