车站信息管理系统(面向对象程序设计python版)
Posted 程序员啊楷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了车站信息管理系统(面向对象程序设计python版)相关的知识,希望对你有一定的参考价值。
一、基本概述
1.项目背景
随着大数据时代的发展,大数据抓取了人们最想要的信息,数据查询能帮助用户获取更有用的信息,让每个人都能享受到大数据带给生活的高效和便捷。
2.设计目的
为了大大缩减人们出行选择站点所需时间,为了让人们在陌生地区,在对当地交通不熟的情况下,能有效获取交通站点地址和联系方式等,所以设计了车站信息管理系统,该系统可以方便人们查询某地区车站、火车站、机场和轮渡相关信息。
3.主要工作
设计了简单版的一个车站信息管理系统,使用Python语言开发,先对需求与设计进行分析,然后开始开发项目,即对具体功能代码的实现,主要数据存储,数据格式化,文件操作与管理等技术,最后对功能实现进行在不同情况下多次测试。
解释:面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。
二、需求分析
1.引入库
主要实现车站相关信息的增、删、改、查等功能
主要用到的模块是正则表达式模块re和操作系统模块os
2.功能清单
a. 录入车站相关信息:
1)输入车站信息,包括车站名称,所属地区,联系电话,具体地址,行政区划代码,
输入格式正确则按行保存数据到文件中。
2)如果输入格式错误,则抛出异常,捕获异常,打印’输入无效’。
3)输入错误可重新输入,输入正确可以继续添加,也可以结束程序。
b. 查找车站相关信息:
1)选择查找的方式,输入查找信息。
2)找到则显示查询结果,没找到则打印’无相关信息’。
c. 删除车站相关信息:
1)当车站信息为空时,打印’车站信息还未录入’,当车站信息不为空时,可输入正确 车站名称可删除对应数据。
2)如果输入车站名称错误,则打印’没有找到该名称的车站信息’。
d. 修改车站相关信息:
1)先显示全部车站信息,输入要修改的车站名称 。
2)输入车站存在且输入格式正确即可修改数据,输入错误,则不修改任何数据。
e. 对车站信息进行排序:
1)先显示全部车站信息,选择升序或降序排序。
2)选择排序方式即可对信息进行重新排序。
f. 统计车站的总数量:
1)输入对应的菜单项,可打印出车站的总数量,方便统计。
g. 显示所有车站信息:
1)输入对应菜单项,显示全部信息,方便用户查找需要的内容。
h. 退出系统:
1)输入对应菜单项,可结束进程,退出系统。
程序设计
函数设计
主函数:
def main():
ctrl = True # 标记是否退出系统
while ctrl:
menu() # 显示菜单
option = input("请选择菜单项:") # 选择菜单项
option_str = re.sub(r"\\D", "", option) # 把非数字替换掉,提取数字
if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
option_int = int(option_str)
if option_int == 0: # 退出系统
print('您已退出车站信息管理系统!')
ctrl = False
elif option_int == 1: # 录入车站相关信息
insert()
elif option_int == 2: # 查找车站相关信息
search()
elif option_int == 3: # 删除车站相关信息
delete()
elif option_int == 4: # 修改车站相关信息
modify()
elif option_int == 5: # 对车站信息进行排序
sort()
elif option_int == 6: # 统计车站的总数量
total()
elif option_int == 7: # 显示所有车站信息
show()
else:
print("你输入的数字不在功能菜单(0 ~ 7)范围内!")
数据存储设计
1)先建立一个空列表,把录入的数据保存到一个字典中,再把字典添加到这个空列表中。
2)利用for循环从列表中把每一个字典提出来,以追加模式写入文件,添加换行符,按行存储。
3)如果文件不存在用写入模式,创建并打开文件,然后再进行2)中的操作。
开发
编写代码
这部分为7个部分,对应7个主要的功能函数,每个函数对应一种功能。
功能函数1:录入
# 1 录入车站相关信息
def insert():
station_list = [] # 保存车站信息的列表,保存字典到这个列表
mark = True # 是否继续添加
while mark:
sta_name = input("请输入车站名称:")
if not sta_name: # 名称为空,跳出循环
break
sta_area = input("请输入地区(如 鲤城区/县):")
if not sta_area: # 地区为空,跳出循环
break
sta_address = input("请输入车站具体地址:")
if not sta_address: # 地址为空,跳出循环
break
try:
sta_division_code = int(input("请输入车站对应县(区)行政区划代码:"))
sta_telephone = int(input("请输入联系电话:"))
except ValueError:
print("输入无效,输入的不是整型数值....重新录入信息")
continue # 重新录入
# 将输入的车站信息保存到字典
station = {"车站名称": sta_name, "所属地区": sta_area, "联系电话": sta_telephone,
"具体地址": sta_address, "行政区划代码": sta_division_code}
station_list.append(station) # 将车站字典添加到车站列表中
input_mark = input("是否继续添加?(yes/no):")
if input_mark == "yes": # 继续添加
mark = True
else: # 不继续添加
mark = False
save(station_list) # 将学生信息保存到文件
print("车站信息录入完毕!!!")
功能函数2:查找
# 2 查找车站信息
def search():
station_query = [] # 保存查询结果的车站列表
mark = True
while mark:
sta_area = ""
sta_name = ""
sta_division_code = ""
if os.path.exists(file_name): # 判断文件是否存在,存在则返回True
mode = input("按所属地区查输入1;按车站名称查输入2:")
if mode == "1":
sta_area = input("请输入车站所属地区:")
elif mode == "2":
sta_name = input("请输入车站名称:")
else:
print("您的输入有误,请重新输入!")
search() # 重新查询
with open(file_name, 'r') as file: # 打开文件
read_sta = file.readlines() # 读取全部内容
for info in read_sta:
d = dict(eval(info)) # 字符串转字典d
if sta_area != "": # 判断是否按所属地区查
if d['所属地区'] == sta_area:
station_query.append(d) # 将找到的车站信息保存到列表中
elif sta_name != "": # 判断是否按车站名称查
if d['车站名称'] == sta_name:
station_query.append(d)
elif sta_division_code != "":
if d['行政区划代码'] == sta_division_code:
station_query.append(d)
show_station(station_query) # 显示查询结果
station_query.clear() # 清空列表
input_mark = input("是否继续查询?(yes/no):")
if input_mark == "yes":
mark = True
else:
mark = False
else:
print("暂未保存数据信息...")
return # 如果return后面有参数,那么就是返回值;如果没有参数,就表示结束程序。
功能函数3:删除
# 3 删除车站信息
def delete():
mark = True # 标记是否循环
while mark:
sta_name = input("请输入要删除的车站名称:")
if sta_name != "": # 判断要删除的车站是否存在,非空即Ture
if os.path.exists(file_name): # 判断文件是否存在
with open(file_name, 'r') as r_file: # 打开文件
station_old = r_file.readlines() # 读取全部内容
# station_old是一个包含全部信息的列表,是从file_name中读出来的
else:
station_old = []
ifdel = False # 标记是否删除
if station_old: # 如果存在车站信息非空则往下走
with open(file_name, 'w') as f: # 以写方式打开文件
for info in station_old:
d = dict(eval(info)) # 字符串转字典
if d['车站名称'] != sta_name: # 某一条信息(字典)车站名称为你输入的
f.write(str(d) + "\\n") # 将一条车站信息写入文件
else:
ifdel = True # 标记已经删除
if ifdel:
print("车站名称为 %s 的车站信息已经被删除..." % sta_name)
else:
print("没有找到车站名称为 %s 的车站信息..." % sta_name)
else: # 不存在车站信息
print("车站信息还未录入,无车站相关信息...")
break # 退出循环
show() # 显示全部车站信息
input_mark = input("是否继续删除?(yes/no):")
if input_mark == "yes":
mark = True # 继续删除
else:
mark = False # 退出删除车站信息功能
功能函数4:修改
# 4 修改车站信息
def modify():
show() # 显示全部车站信息
if os.path.exists(file_name): # 判断文件是否存在
with open(file_name, 'r') as r_file: # 打开文件
station_old = r_file.readlines() # 读取全部内容
else:
return
sta_name = input("请输入要修改的车站名称:")
with open(file_name, "w") as w_file: # 以写模式打开文件
for info in station_old:
d = dict(eval(info)) # 字符串转字典
if d["车站名称"] == sta_name: # 是否为要修改的车站
print("找到了这个车站,可以修改该车站信息!")
while True: # 输入要修改的信息
try:
d["车站名称"] = input("请输入车站名称:")
d["所属地区"] = input("请输入车站地区:")
d["联系电话"] = int(input("请输入联系电话:"))
d["具体地址"] = input("请输入具体地址:")
d["行政区划代码"] = int(input("请输入行政县区划代码:"))
except ValueError:
print("您的输入有误,请重新输入。")
else:
break # 跳出循环
info = str(d) # 将字典转换为字符串
w_file.write(info + "\\n") # 将修改的信息写入到文件
print("修改成功!")
else:
w_file.write(info) # 将未修改的信息写入到文件
mark = input("是否继续修改其他车站信息?(yes/no):")
if mark == "yes":
modify() # 重新执行修改操作
else:
print("退出修改!")
功能函数5:排序
# 5 排序
def sort():
show() # 显示全部车站信息
if os.path.exists(file_name): # 判断文件是否存在
with open(file_name, 'r') as file: # 打开文件
station_old = file.readlines() # 读取全部内容
station_new = []
for info in station_old:
d = dict(eval(info)) # 字符串转字典
station_new.append(d) # 将转换后的字典添加到列表中
else:
return
sign = input("请选择(0升序;1降序):")
if sign == "0": # 按升序排序
sequence = False # 标记变量,为False表示升序排序
elif sign == "1": # 按降序排序
sequence = True # 标记变量,为True表示降序排序
else:
print("您的输入有误,请重新输入!")
sort()
mode = input("请选择排序方式 (1按行政区划代码排序;2按联系电话排序) :")
if mode == "1": # 按行政区划代码排序
station_new.sort(key=lambda x: x["行政区划代码"], reverse=sequence)
elif mode == "2": # 按联系电话排序
station_new.sort(key=lambda x: x["联系电话"], reverse=sequence)
else:
print("您的输入有误,请重新输入!")
sort()
show_station(station_new) # 显示排序结果
功能函数6:总计
# 6 统计车站总数量
def total():
if os.path.exists(file_name): # 判断文件是否存在
with open(file_name, 'r') as r_file: # 打开文件
station_old = r_file.readlines() # 读取全部内容
if station_old:
print("一共有 %d 个车站!" % len(station_old))
else:
print("还没有录入车站信息!")
else:
print("暂未保存数据信息...")
功能函数7:显示全部
# 7 显示所有车站信息
def show():
station_new = []
if os.path.exists(file_name): # 判断文件是否存在
with open(file_name, 'r') as rfile: # 打开文件
station_old = rfile.readlines() # 读取全部内容
for info in station_old:
station_new.append(eval(info)) # 将找到的车站信息保存到列表中
if station_new:
show_station(station_new)
else:
print("暂未保存数据信息...")
# 将保存在列表中的车站信息显示出来
def show_station(station_list):
if not station_list:
print("(o@.@o) 很抱歉,无相关数据信息! (o@.@o) \\n")
return
format_title = "{:^12}{:^12}\\t{:^8}\\t{:^27}\\t{:^12}"
print(format_title.format("车站名称", "地区", "联系电话", "具体地址", "行政区划代码"))
format_data = "{:^12}{:^10}\\t{:^12}\\t{:^25}\\t{:^8}"
for info in station_list:
print(format_data.format(str(info.get("车站名称")), str(info.get("所属地区")), str(info.get("联系电话")),
str(info.get("具体地址")), str(info.get("行政区划代码"))))
文件操作与管理
# 将车站信息保存到文件
def save(sta_list):
try:
with open(file_name, "a") as f1: # 以追加模式打开
for info in sta_list:
f1.write(str(info) + "\\n") # 列表中的字典按行存储,添加换行符
except OSError:
f2 = open(file_name, "w") # 文件不存在,创建文件并打开
for info in sta_list:
f2.write(str(info) + "\\n") # 按行存储,添加换行符
f2.close()
实例测试
提示:随便输入几个例子,主要用于对程序的测试。
完成项目开发阶段,进入测试环节, 首先在test.py这个模块分开对各个函数进行测试,然后对整个代码进行测试和单次调试,对多种不同的情况精选测试,基本能完成对应功能。
以下是对一些典型情况的测试结果图:
总结
简单总结一下
通过这次项目,同学们对文件操作与管理就应该有了更好的掌握,更加了解程序设计的过程,虽然基本功能都能实现,但是程序还有许多不足的地方。了解到写程序应该先完成主体的搭建,再完成主要功能的开发,最终才是增加程序健壮性,完善功能实现和提高用户体验感的设计。
在这次的学习过程中,体会到了:
- 查阅资料是学习必不可少的部分,要学会善于查找资料,虚心向其它程序员学习。
- 要建立自信心,相信自己能写好一个完整的程序。
- 要善于调试,从中发现错误,要多次测试,发现异常,处理异常增强程序的健壮性。
源码下载:
https://download.csdn.net/download/Big_Data_Kai/20674907
以上是关于车站信息管理系统(面向对象程序设计python版)的主要内容,如果未能解决你的问题,请参考以下文章
最新Python大数据之Python基础学生管理系统面向对象版