赛事管理系统

  1. 熟练掌握线性表、栈、队列、串、数组、树和图等基本数据结构的逻辑特性和存储表示方法;熟练掌握各种基本数据结构的基本算法和其应用;熟练掌握问题分析、数据结构设计、程序设计的基本技能和技术。
  2. 能够综合运用数据结构与算法和相关的数学等理论知识对复杂工程中的算法问题进行抽象、分析和建模;能够依据工程实际问题的需求合理组织数据、并在计算机中有效地存储数据;能够针对复杂工程中的算法问题,设计出比较合理的解决方案,利用具体的编程语言实现解决方案,并具有一定的创新思维能力。
  3. 具有良好的工程素养和职业素养,诚信守法,能够坚持职业操守和道德规范;具有精益求精的工匠精神、创新精神和探索未知终身学习的意识;具有科技报国的社会责任感、使命感和爱国主义情操。

 一.课程设计的要求

  1. 问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么,限制的条件是什么。
  2. 逻辑设计:对问题中涉及到的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序和各抽象数据类型,逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图。
  3. 物理设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据结构存储结构的类型定义,写出函数形式的算法框架。
  4. 程序编码:把详细设计的结果进一步求精为程序设计语言。同时加入一些注解和断言,使程序中逻辑概念清晰。
  5. 程序调试和测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序和注释,形成格式和风格良好的源程序清单和结果。
  6. 结果分析:程序运行结果包括正确的输入及其输出结果、含有错误的输入和输出结果、算法时间复杂度和空间复杂度分析。
  7. 撰写课程设计报告:总结和提升上述过程和步骤,写出结构严谨、表述清楚、符合设计规范的报告。

二. 课程设计内容

       中国大学生计算机设计大赛是我国高校面向本科生的计算机应用设计大赛,大赛旨在激发学生学习计算机知识和技能的兴趣与潜能,提高学生运用信息技术解决实际问题的综合能力。通过大赛这种计算机教学实践形式,可展示师生的教与学成果,最终以赛促学,以赛促教,以赛促创。该赛事在历届学生中影响力较大,参与者众多,请结合2021届省赛参赛的数据,借助数据结构课程所学的相关知识,通过对数据的处理和分析,熟悉数据结构设计及数据处理在信息管理系统中应用的重要性。赛事相关数据存储在文本文件和excel文件中,相应的文件信息说明如表1所示。其中,各个文件中不同的数据项之间均使用#分隔,图1中给出了文件team.txt中参赛信息的对应数据示例。

                                             图1. 参赛队基本信息 

【问题描述】

  本次课程设计要求协助中国大学生计算机设计大赛江苏省组委会,设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理解决以下问题:

(1)能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项;包括增加、删除、修改参赛队伍的信息。

参赛队伍信息维护:

1. 录入参赛队伍信息

2. 删除参赛队伍信息

3. 修改参赛队伍信息  

(2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。

参赛队伍信息查询:

1. 按参赛队伍编号查找

2. 查询

3. 成功则输出该队伍基本信息和平均查找长度

4. 失败则输出“查找失败!”

(3)能够提供按参赛学校查询参赛团队 ,即,根据提示输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队按队伍编号有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)

(4)为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)

(5)赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。

三.题目分析与实现

根据题目要求,将系统功能分为五个,即参赛队伍信息维护、参赛队伍信息查询、参赛团队查询、决赛叫号、 校园导航,每个功能用一个数字表示,从键盘输入相应数字,实现对应功能。

def main_menu():
    print("===========================================")
    print("   欢迎使用江苏省大学生计算机设计大赛赛事管理系统")
    print("===========================================")
    print("1. 参赛队伍信息维护")
    print("2. 参赛队伍信息查询")
    print("3. 参赛团队查询")
    print("4. 决赛叫号")
    print("5. 校园导航")
    print("0. 退出系统")
    print("===========================================")
def main():
    while True:
        main_menu()
        try:
            choice = int(input("请选择要进行的操作(0~5):"))
        except ValueError:
            print("请输入数字!")
            continue
        if choice == 1:
            manage_team()

        elif choice == 2:
            search_team()

        elif choice == 3:
            query_by_school()

        elif choice == 4:
            call_numbers()

        elif choice == 5:
            school_distance()

        elif choice == 0:
            break

        else:
            print("输入错误,请重新输入")

    print("程序已退出!")


if __name__ == '__main__':
    main()

 参赛队伍信息维护

参赛队伍信息维护系统中包含有添加参赛队伍,删除参赛队伍,修改参赛队伍信息,显示所有参赛队伍信息四个功能,每个功能对应一个序号,输入相应序号可实现对应功能。

def manage_team():
    read()
    print('===============信息维护系统===============')
    print('1. 添加参赛队伍')
    print('2. 删除参赛队伍')
    print('3. 修改参赛队伍信息')
    print('4. 显示所有参赛队伍信息')
    print('0. 退出程序')
    print('==========================================')
    while True:
        choice = input('请输入要执行的操作序号(0-4):')
        if choice == '1':
            add_team()
            write()
            print('添加成功!')
        elif choice == '2':
            remove_team()
            write()
        elif choice == '3':
            modify_team()
            write()
        elif choice == '4':
            for team in teams:
                print(team)
        elif choice == '0':
            print('程序已退出。')
            break
        else:
            print('输入错误,请重新输入!')
读取信息:
读取txt文件内的参赛队伍信息,文件里的信息以(参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师)形式存储,将文件里的信息一行行读取,以字典形式依次插入到列表teams中存储。
teams = []


def read():
    with open('teams.txt', 'r', encoding='utf-8') as file:
        i = 0
        for line in file.readlines():
            if i > 0:
                info = line.split(',')
                info = [i.replace("\n", "") for i in info]
                teams.append({
                    'id': int(info[0]),
                    'name': info[1],
                    'school': info[2],
                    'category': info[3],
                    'members': info[4],
                    'adviser': info[5]
                })
            i += 1
写入信息:
按txt文件里的信息存储方式,将teams列表里的信息依次写入文件。
def write():
    with open('teams.txt', 'w', encoding='utf-8') as file:
        file.write('参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师' + '\n')
        for team in teams:
            file.write(
                str(team['id']) + ',' +
                team['name'] + ',' +
                team['school'] + ',' +
                team['category'] + ',' +
                '|'.join(team['members']) + ',' +
                team['adviser']
                + '\n')
1.增加参赛队伍信息
建立一个字典team存放新增参赛队伍信息,从键盘输入的相关信息,全部数据输入完成后,将字典team中的信息添加进列表teams里,返回更新的列表teams。
def add_team():
    team = {}
    team['id'] = int(input('请输入参赛队编号:'))
    team['name'] = input('请输入参赛作品名称:')
    team['school'] = input('请输入参赛学校:')
    team['category'] = input('请输入赛事类别:')
    team['members'] = input('请输入参赛者姓名,多个姓名以竖线分隔:').split('|')
    team['adviser'] = input('请输入指导老师姓名:')
    teams.append(team)
    return teams
2. 删除参赛队伍信息
用户从键盘输入想要删除的参赛队伍编号,for循环遍历teams列表,如果可以在列表中找到输入的参赛队编号,那么删除,如果不能找到,输出“没有找到该参赛队,请确认编号是否正确”,返回更新的列表teams。
def remove_team():
    team_id = int(input('请输入要删除的参赛队编号:'))
    for i in range(len(teams)):
        if teams[i]['id'] == team_id:
            del teams[i]
            print('删除成功!')
            break
    else:
        print('没有找到该参赛队,请确认编号是否正确!')
    return teams
3. 修改参赛队伍信息
用户从键盘输入想要修改信息的参赛队伍编号,for循环遍历teams列表,如果可以在列表中找到输入的参赛队编号,那么再次输入该参赛队伍新的信息,如果不能找到,输出“没有找到该参赛队,请确认编号是否正确”,返回更新的列表teams。
def modify_team():
    team_id = int(input('请输入要修改的参赛队编号:'))
    for i in range(len(teams)):
        if teams[i]['id'] == team_id:
            teams[i]['name'] = input('请输入新的参赛作品名称:')
            teams[i]['school'] = input('请输入新的参赛学校:')
            teams[i]['category'] = input('请输入新的赛事类别:')
            teams[i]['members'] = input('请输入新的参赛者姓名,多个姓名以竖线分隔:').split('|')
            teams[i]['adviser'] = input('请输入新的指导老师姓名:')
            print('修改成功!')
            break
    else:
        print('没有找到该参赛队,请确认编号是否正确!')
    return teams

参赛队伍信息查询

参赛队伍信息查询系统包含显示所有参赛队伍信息,按照参赛队伍编号查找相关信息两个功能,分别对应相应序号,用户输入序号即可实现对应功能。

如果选择1,显示所有参赛队伍信息,则遍历字典 teams 中的所有元素并输出

如果选择2,按照参赛队伍编号查找, 则先从用户输入中获取目标赛事编号 key,然后调用search_tree 函数查找对应的参赛队伍信息。如果查找成功,则输出该参赛队伍信息,查找成功次数,平均查找长度ASL;否则输出“没有找到该参赛队,请确认编号是否正确”的提示信息。

def print_search_menu():
    print('===============信息查询系统===============')
    print('1. 显示所有参赛队伍信息')
    print('2. 按照参赛队伍编号查找')
    print('0. 退出程序')
    print('==========================================')
def competition():
    file_path = 'teams_exists.txt'
    teams = read_txt(file_path)
    root = build_tree(teams)
    total_count = 0  
    success_count = 0  # 查找成功的次数
    while True:
        print_search_menu()
        choice = input('请输入要执行的操作序号(0-2):')
        if choice == '1':
            for key in teams:
                print(teams[key])
        elif choice == '2':
            key = int(input('请输入要查找的参赛队伍编号:'))
            team, count = search_tree(root, key)
            total_count += count
            if team:
                print(team)
                success_count += 1
            else:
                print('没有找到该参赛队,请确认编号是否正确!')
        elif choice == '0':
            print('程序已退出。')
            break
        else:
            print('输入错误,请重新输入!')

        if success_count > 0:
            asl = (1*1+2*2+4*3+8*4+16*5+32*6+64*7+128*8+143*9)/398
            print(f"查找成功次数:{success_count}")
            print(f'平均查找长度ASL:{asl:.2f}')

读取 TXT 文件中的数据,将每个参赛队伍的信息保存为一个字典对象,并以赛事编号为 key,将字典对象存储到字典 teams 中。

def read_txt(file_path):
    teams = {}
    if os.path.exists(file_path):
        with open(file_path, 'r', encoding='utf-8') as f:
            i = 0
            for line in f:
                if i > 0:
                    data = line.strip().split('#')
                    team = {
                        'id': int(data[0].strip()),
                        'name': data[1].strip(),
                        'school': data[2].strip(),
                        'category': data[3].strip(),
                        'members': data[4].strip(),
                        'adviser': data[5].strip()
                    }
                    teams[team['id']] = team
                i += 1
    return teams

按参赛队伍编号大小来创建一个二叉树。

def build_tree(teams):
    root = TreeNode()
    for key in teams:
        node = TreeNode(teams[key])
        if not root.value:
            root.value = node.value
        else:
            cur = root
            while True:
                if key < cur.value['id']:
                    if not cur.left:
                        cur.left = node
                        break
                    else:
                        cur = cur.left
                elif key > cur.value['id']:
                    if not cur.right:
                        cur.right = node
                        break
                    else:
                        cur = cur.right
                else: 
                    cur.value = node.value
    return root
查找功能实现
在二叉树中按照赛事编号查找目标节点,并返回该节点的值。从根节点开始不断地进行比较,如果当前节点的赛事编号等于目标编号,则返回该节点的值;如果目标编号小于当前节点的编号,则在左子树中继续查找;如果目标编号大于当前节点的编号,则在右子树中继续查找。
def search_tree(root, key):
    cur = root
    count = 0
    while cur:
        count += 1
        if key == cur.value['id']:
            return cur.value, count
        elif key < cur.value['id']:
            cur = cur.left
        else:
            cur = cur.right
    return None, count

按参赛学校查询参赛团队

从txt文件里读取信息存放在teams里,用户从键盘输入参赛学校,for循环遍历teams,如果学校条件符合,将当前队伍信息加入结果列表,遍历完成后,result列表中的队伍按编号排序,最后按编号从大到小输出。

def query_by_school():
    file_path = 'teams_exists.txt'
    teams = read_txt(file_path)
    key = input('请输入参赛学校:')
    result = []
    for team in teams:
        if key == teams[team]['school']:
            result.append(teams[team])
    result = sorted(result, key=lambda x: x['id'])
    for t in result:
        print(t)

决赛叫号系统

决赛叫号系统中包含显示各决赛室情况,叫号功能。

def print_menu():
    print('=================决赛叫号系统=================')
    print('1. 显示各赛事决赛室现场情况')
    print('2. 进行下一轮叫号')
    print('0. 退出程序')
    print('=============================================')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值