基于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源码
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
猜你喜欢
- 一、文件的编码计算机中有许多可用编码:UTF-8GBKBig5等UTF-8是目前全球通用的编码格式除非有特殊需求,否则,一律以UTF-8格式
- 这里所说的“小偷”指的是在ASP中运用XML中的xmlhttp组件提供的强大功能,把远程网站上的数据(图片,网页及其他文件)抓取采集到本地,
- 在找工作的时候,我们会选择上网查询招聘的信息,或者是通过一些招聘会进行现场面试。但由于信息更新不及时,有一些岗位会出现下架的情况,如果我们不
- 年前帮manager 招GUI设计实习生 (PS. 这个实习生职位依然open,欢迎有兴趣的同学来投,邮箱jj.ying [at] hp.c
- 如何剔除HTML标识?这里没有使用正则表达式来去除,当然大家用正则"<.+?>"也可以实现这个功能只留下干净
- 本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下Github:Tetris代码:# -*- coding:
- 这个我早就改好了一直没有放上来.现在发给大家用用注意这几个变量它们影响到提示框的效果代码:var rT=true;//允许图像过渡
- 1、将css与javascript全部用下边的方法分离到外部文件中去。<link rel="stylesheet"
- 先 Create table 吧create table emp(id int not null primary key,name varc
- 1. 需求vs现状1.1 需求要求做一个ERP后台辅助管理的程序,有以下几项基本要求:1. 基本的增删改查功能2. 基于对象的权限控制(如:
- 你是否知道JavaScript其实也是一个函数式编程语言呢?本指南将教你如何利用JavaScript的函数式特性。要求:你应当已经对Java
- 光学元件类平面反射镜是一种极为简单的模型,因为我们只需要考虑一个平面即可。但是除此之外的其他光学元件,可能会变得有些复杂:我们必须考虑光在入
- 一、word转pdf先安装win32库:pip install pywin32from win32com.client import gen
- 发现太多人不会用等待了,博主今天实在是忍不住要给大家讲讲等待的必要性。很多人在群里问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,
- 前言ThinkPHP 3.2 基于 ThinkPHP 3.1 的基础上有许多的变化,我觉得这个版本应该设立为 ThinkPHP 4.0 而不
- 本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下:先来看个栗子:下面来看一下I/O秘籍型的线程,举个栗子——爬虫,
- 类似于and操作类似于or操作# 类型转换# sortedli=[2,45,1,67,23,10]li.sort() #list的排序方法p
- 插入一条记录后,如何得到最新的自动增加ID?我们要用到SQL Server的@@IDENTITY。它能够记录下系统最近使用的一个IDENTI
- 问: 如果数据表中有时间字段,现在要迁移到其他时区的服务器上,该如何处理呢?答:在高版本的mysqldump中,新增了一个选项:--tz-u
- 内置模块(一)Python内置的模块有很多,我们也已经接触了不少相关模块,接下来咱们就来做一些汇总和介绍。内置模块有很多 & 模块中