车站信息管理系统(面向对象程序设计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这个模块分开对各个函数进行测试,然后对整个代码进行测试和单次调试,对多种不同的情况精选测试,基本能完成对应功能。
以下是对一些典型情况的测试结果图:


总结

简单总结一下
通过这次项目,同学们对文件操作与管理就应该有了更好的掌握,更加了解程序设计的过程,虽然基本功能都能实现,但是程序还有许多不足的地方。了解到写程序应该先完成主体的搭建,再完成主要功能的开发,最终才是增加程序健壮性,完善功能实现和提高用户体验感的设计。
在这次的学习过程中,体会到了:

  1. 查阅资料是学习必不可少的部分,要学会善于查找资料,虚心向其它程序员学习。
  2. 要建立自信心,相信自己能写好一个完整的程序。
  3. 要善于调试,从中发现错误,要多次测试,发现异常,处理异常增强程序的健壮性。

源码下载:
https://download.csdn.net/download/Big_Data_Kai/20674907

以上是关于车站信息管理系统(面向对象程序设计python版)的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象版学员管理系统(附源码)

学员管理系统(面向对象版)

[课程设计] 学生成绩管理系统(Python版)

最新Python大数据之Python基础学生管理系统面向对象版

最新Python大数据之Python基础学生管理系统面向对象版

python基础入门之十八 —— 面向对象版学员管理系统