Python实验之制作一个公交车站查询系统。(附有源代码)

目录

  • 一、设计目的
  • 二、需求分析
  • 三、系统模块设计
  • 四、详细设计
  • 五、需要设计的函数
  • 六、Python源码
  • 七、运行效果
  • 一、设计目的

    1、教学目的
    本课程设计是学生学习完《Python程序设计》课程后,进行的一次全面的综合训练,通过课程设计,更好地掌握使用Python语言进行程序设计的方法,加深对Python语言特点和使用Python语言进行程序设计开发过程的理解,加强动手能力。其主要目的是:
    (1)进一步培养学生Python程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;
    (2)针对Python语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
    (3)掌握Python语言的编程技巧和上机调试程序的方法。
    (4)掌握程序设计的常用算法。
    2、教学要求
    (1)要求从所给题目中任选若干个,每个学生必须独立完成课程设计,不能互相抄袭。
    (2)设计完成后,对所完成的工作进行答辩。
    (3)要求写出一份详细的课程设计报告。
    (4)程序设计题目,须提交相应的程序,并需提供加注释的源程序,能正常运行。

    二、需求分析

    1、问题
    根据需求,该系统所应包含的信息有以下一些:
    后台用户管理员的基本信息:
    账号、密码
    各路公交车的基本信息:
    每路公交车对应的线路信息
    2、系统
    采用Python语言实现,开发环境为PythonCharm,可以运行在操作系统windows98及以上皆可。
    3、运行要求
    界面友好,操作方便,容错性强。

    三、系统模块设计

    主界面模块:完成系统菜单的显示。
    功能选择模块:根据用户的选择,完成其相应的功能。
    线路查询模块:根据用户提供的线路,查询该线路所经过的站点。
    站点查询的模块:根据用户提供的站点,查询经过该站点的所有线路。
    后台管理员的模块:后台管理员可以进行一些操作,例如:删除所有线路、添加线路等
    后台管理员的账号系统管理的模块:注册后台管理员的账号和密码。
    换乘信息的模块:根据用户提供的起点和终点,帮助用户找到最便捷的路线。

    四、详细设计

    数据项名称 数据项系统表示和数据类型
    账号 user、整型
    密码 password、字符串
    线路 line、字符串
    站点 site、字符串

    五、需要设计的函数

  • 主函数。
  • 管理员账号管理界面的函数。
  • 用户登录的函数。
  • 后台管理员界面的函数。
  • 定义修改线路的函数。
  • 判断是否存在线路的函数。
  • 线路查询的函数。
  • 判断站点是否存在的函数。
  • 站点查询的函数。
  • 检查添加线路是否存在的函数。
  • 添加线路的函数。
  • 清楚所有线路的函数。
  • 展示所有线路的函数。
  • 删除线路的函数。
  • 判断是否存在线路的函数。
  • 展示特定线路中的站点的函数。
  • 换乘信息的函数。
  • 判断线路直达的函数。
  • 存储数据的函数。
  • 断站点所在的线路的函数。
  • 六、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(f):  # 用户登录的函数
        def inner(*args, **kwargs):
            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('您已经登录成功!!!')
                            res = f(*args, **kwargs)
                            return res
                    except:
                        print('对不起,你登录失败,不可以让您进入后台管理员界面')
                        break
    
        return inner
    
    
    # 装饰器用于检验用户登录
    @login
    def manager():  # 后台管理员界面的函数
        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('请重新做出你的选择...')
    
    
    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()
    
    

    七、运行效果

    公交车站查询系统

    来源:Kinght_123

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实验之制作一个公交车站查询系统。(附有源代码)

    发表评论