计设赛事管理系统(C++)

本文探讨了如何利用数据结构课程知识为中国大学生计算机设计大赛江苏省省级赛事管理系统设计数据结构,包括参赛队伍管理、成绩查询、文件操作、比赛进程模拟、地图导航等,涉及线性数据结构、排序算法和错误处理。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

计设赛事管理系统


前言

本文灵感来源于数据结构课设:`
中国大学生计算机设计大赛省级赛事管理系统
中国大学生计算机设计大赛是我国高校面向本科生的计算机应用设计大赛,大赛旨在激发学生学习计算机知识和技能的兴趣与潜能,提高学生运用信息技术解决实际问题的综合能力。通过大赛这种计算机教学实践形式,可展示师生的教与学成果,最终以赛促学,以赛促教,以赛促创。该赛事在历届学生中影响力较大,参与者众多。
了解该赛事组织及管理方式,利用数据结构课程所学的相关知识,为中国大学生计算机设计大赛江苏省组委会设计一个省级赛事管理系统。以2021年省赛数据为例,通过对数据的处理和分析,设计合理的数据结构对赛事相关的数据进行存储及处理。

课程设计目的

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

课程设计的要求

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

任务分析

设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理解决以下问题:

1.赛事信息管理:

从team.txt中读取参赛队伍的基本信息,设计合适的数据结构存储,能实现对参赛队伍的增加、修改和浏览。为参赛队伍分配一个分数为60~100之间的初赛成绩,并能实现参赛队伍的成绩查询(实现基于二叉排序树的查找)。设计合适的输入输出,根据提示输入参赛队编号,查询队伍的初赛成绩,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和初赛成绩信息)。另外,输出全部参赛队的平均查找长度ASL。

文件操作模块

打开文件后,使用getline函数,逐行读取,然后在使用while循环,如果遇到#就停止,然后将数据压入到vector类型的items当中,然后如果items当中的函数如果有六个元素,那么元素就一个一个插入到a当中,然后将a插入到teamsall和二叉排序树当中。

在这里插入代码片

本板块要求是对系统信息的简单处理,增删改查;由于涉及到对信息大量的修改,故考虑使用链表结构,实现参赛队伍的成绩查询使用基于二叉排序树的查找,考虑使用二叉链表结构。
首先定义一个类Team,来存储每一个对象的参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师等基本信息,代码如下:

class Team {
private:
    //基本信息
    string TeamID;  //参赛队编号
    string workname;    //参赛作品名称
    string school;  //参赛学校
    string eventCate;   //赛事类别    赛事类别共11项
    string participants;  //参赛者
    string teachers;  //指导老师
public:
    //构造Team
    //Team()=default;
	Team();
    Team(string id, string Workname, string schoolname, string eventcatename, string Participant, string Teacher);

 
    //输出参赛队编号
    string getTeamID() {
        return TeamID;
    }
 
    //输出作品名称
    string getworkname() {
        return workname;
    }
 
    string getschool() {
        return school;
    }
 //赛事类别
    string geteventCate() {
        return eventCate;
    }
  //参赛者
    string getparticipants() {
        return  participants;
    }
 
    string getteachers() {
        return  teachers;
    }
 
    void insertTeamID(string id)
    {
        TeamID = id;
    }
 
    void insertworkname(string Workname)
    {
        workname = Workname;
    }
 
    void insertschool(string schoolname)
    {
        school = schoolname;
    }
 
    void inserteventCate(string eventcatename)
    {
        eventCate = eventcatename;
    }
 
    void insertparticipants(string Participant)
    {
        participants = Participant;
    }
 
    void insertteachers(string Teacher)
    {
        teachers = Teacher;
    }
};

以及二叉排序树的结点结构体TreeNode,其中节点保存每个以及指向左右子节点的指针。

struct TreeNode {
    Team team;
    TreeNode* left;
    TreeNode* right;
};

增加参赛队伍信息

接收用户输入的参赛队信息,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师,创建一个新的参赛队对象,并将输入的信息赋值给相应的属性并将新的参赛队对象添加到数据结构中。

修改参赛队伍信息

接收用户输入的参赛队编号,在数据结构中查找对应的参赛队对象,如果找到匹配的参赛队对象,提供用户选择要修改的属性,接收用户输入的新值,并将其赋值给相应的属性。

删除参赛队伍信息

接收用户输入的参赛队编号,在数据结构中查找对应的参赛队对象,如果找到匹配的参赛队对象,将其从类中删除。

根据编号查找参赛队伍信息

提示用户输入队伍相应编号,反馈给用户包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等信息,并且计算查找长度。
对于按参赛学校查询参赛团队并且要求有序输出的情况,可以选择选择排序
选择排序的优势在于其简单性和易于实现。以下是选择排序的一些优势:

1.简单易懂:选择排序是一种直观且易于理解的排序算法。它的基本思想是通过每次选择未排序部分的最小(或最大)元素并放置在已排序部分的末尾,以逐步构建有序序列。

2.不占用额外空间:选择排序是一种原地排序算法,即不需要额外的辅助数组或数据结构来进行排序。它仅需要在原始数组中进行元素的交换操作,节省了空间复杂度。

3.最好情况下的性能优势:选择排序在最好情况下的比较次数是确定的。无论输入数据的顺序如何,都需要进行 n-1次比较操作,其中 n 是待排序元素的个数。这使得选择排序在某些特定场景下(如已经基本有序的序列)可能比其他排序算法更加高效。

4.对于小规模数据或部分有序数据的适应性:由于选择排序的特点,它在处理小规模数据或者部分有序的数据时可能表现良好。因为选择排序的比较次数是固定的,不受数据规模的影响,并且对已经有序的部分不会进行多余的比较操作。

错误处理

针对可能出现的错误情况,如无效的输入或找不到对应的参赛队信息,提供适当的错误提示和处理机制。

决赛现场模拟:

首先进行决赛分组,生成决赛秩序册,供参赛队查询。根据赛事类别将参赛队伍分配到17个决赛室(编号为1~17)。秩序册中每个决赛室的进场顺序为初赛成绩降序排列。(排序算法从选择排序、插入排序、希尔排序、归并排序、堆排序中选择一种,并为选择该算法的原因做出说明)然后,模拟决赛秩序。比赛现场会设置大型候赛区,场地中有大屏以时间线动态展示各决赛室中正在决赛的队伍,侯赛的队伍及比赛结束的队伍信息。请编写程序模拟候赛区大屏上动态展示各参赛队候场、比赛中、比赛结束的状态。

读取赛事组织文件中的参赛队信息,将其按照赛事类别分到各个决赛室的队列中(所在赛区查询)。
首先先让用户选择所在赛区,确定查询哪个赛区。

首先创建赛区

vector<Team> a1;
vector<Team> a2;
vector<Team> a3;
vector<Team> a4;
vector<Team> a5;
vector<Team> a6;
vector<Team> a7;
vector<Team> a8;
vector<Team> a9;
vector<Team> a10;
vector<Team> a11;
vector<Team> a12;
vector<Team> a13;
vector<Team> a14;
vector<Team> a15;
vector<Team> a16;
vector<Team> a17;

根据不同的赛事类别来分赛区,每三个类别一个赛区
将不同类别名进行标号,通过判断语句进行分区。

比赛进程的查询,编写函数参数为赛区名,输出当前正在进行比赛的队伍,并且提醒下一组将要参赛的队伍

决赛地图导航:

为参赛者提供决赛主办地的各种路径导航的查询服务,以我校长山校区提供比赛场地为例,为参赛者提供不少于12个目标地的导航。为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供图中任意目标地(建筑物)的问路查询。即查询任意两个目的地(建筑物)之间的一条最短的简单路径。
这是一个图论问题,而且校园内道路一般是双向通行的,所以这是一个无向图。对于图的存储结构而言,图中各个景点的存储结构有邻接表和邻接矩阵两种存储结构,考虑到顶点个数少于 50 个,所以邻接表和邻接矩阵的复杂度相同。本题中选择使用邻接矩阵来存储。任务中要求求解出图中景点的问路查询,即为给定两个结点,求解出两个点之间的最短路径。根据数据结构课程所学知识,有多种经典算法可以解决最短路径问题,包括 Dijkstra 算法,Floyd算法。考虑到校园中道路没有负权边,即算法均可解决最短路径问题。 其中 Dijkstra 算法求的是单源最短路径:即从一个结点出发到其它所有结点的最短路径,算法的时间复杂度为 O(n2),但题目要求任意两个结点的最短路径,所以还是要在外层增加一个循环,以求得多源最短路径。 而 Floyd 算法求的是多源最短路径:即从任意结点出发到其它所有结点的最短路径,算法的时间复杂度为 O(n3),它可以一次性求得所有结点间的最短路径,且算法思想简单,便于理解。所以我们这一项目采用Floyd算法。

提供建筑物相关信息的查询服务

提示用户输入要查询的建筑物名称,根据用户输入的建筑物名称,在校园地图中查找相应的建筑物信息,输出建筑物的相关信息,如名称、位置坐标等。

提供任意两个目标地的导航查询

提示用户输入起始建筑物和目标建筑物的名称,利用合适的算法(如最短路径算法,如Dijkstra算法)计算起始建筑物到目标建筑物的最短路径,输出最短路径上的建筑物信息,以指导参赛者从起始建筑物到目标建筑物的导航。

校验和错误处理

在查询过程中,校验用户输入的建筑物名称是否有效,如确保输入不为空或存在于校园地图数据中,处理可能出现的错误情况,如无效的起始建筑物或目标建筑物、无法到达目标建筑物等,处理可能出现的错误情况,如无效的起始建筑物或目标建筑物、无法到达目标建筑物等。

无向带权图

主函数显示菜单

int main()
{
    insertinformation();
    category_separate(teamsall);
    while (true) {
        cout << "================== 赛事管理系统 ==================" << endl;
        cout << "0. 退出系统" << endl;
        cout << "1. 增加参赛队伍" << endl;
        cout << "2. 删除参赛队伍" << endl;
        cout << "3. 修改参赛队伍" << endl;
        cout << "4. 按参赛队编号查询参赛队伍" << endl;
        cout << "5. 按参赛学校查询参赛队伍" << endl;
        cout << "6. 比赛进程的查询" << endl;
        cout << "7. 地图导航功能" << endl;
        cout << "=============================================" << endl;
        cout << "请输入操作选项:";
        int a;
        cin >> a;
        switch (a)
        {
        case 1:
        {
            string no, project, schoolname, event, participants, teacher;
            cout << "请输入参赛队编号:" << endl;
            cin >> no;
            cout << "请输入参赛作品名称:" << endl;
            cin >> project;
            cout << "请输入参赛参赛学校:" << endl;
            cin >> schoolname;
            cout << "请输入参赛的赛事类别:" << endl;
            cin >> event;
            cout << "请输入参赛者:" << endl;
            cin >> participants;
            cout << "请输入参赛的指导老师:" << endl;
            cin >> teacher;
            Team a;
            a.insertteamno(no);
            a.insertartname(project);
            a.insertschool(schoolname);
            a.insertcategory(event);
            a.insertparticipants(participants);
            a.insertcoachs(teacher);
            addteam(no, project, schoolname, event, participants, teacher);
            addteam2(teamsall, a);
            break;
        }
        case 2:
        {
            cout << "请输入你想删除的参赛队伍编号:" << endl;
            string l;
            cin >> l;
            deleteteam(teamsall, l);
            deletfile(l);
            break;
        }
        case 3:
        {
            cout << "请输入你想修改的参赛队伍编号:" << endl;
            string l;
            cin >> l;
            string no, project, schoolname, event, participants, teacher;
            cout << "请输入参赛队编号:" << endl;
            cin >> no;
            cout << "请输入参赛作品名称:" << endl;
            cin >> project;
            cout << "请输入参赛参赛学校:" << endl;
            cin >> schoolname;
            cout << "请输入参赛的赛事类别:" << endl;
            cin >> event;
            cout << "请输入参赛者:" << endl;
            cin >> participants;
            cout << "请输入参赛的指导老师:" << endl;
            cin >> teacher;
            revise(l, no, project, schoolname, event, participants, teacher);
            reworkteam(teamsall, l, no, project, schoolname, event, participants, teacher);
            break;
        }
        case 4:
        {
            cout << "请输入你想查询的参赛队伍编号:" << endl;
            string l;
            cin >> l;
            cout << "=====查询结果如下:=====" << endl;
            searchno(root, l);
            break;
        }
        case 5:
        {
            cout << "请输入你想查询的参赛队伍的学校:" << endl;
            string l;
            cin >> l;
            sortprint(teamsall, l);
            break;
        }
        case 6:
        {
            cout << "请输入你想查询的赛区数字:" << endl;
            int l;
            cin >> l;
            cout << "=====你想查询" << l << "赛区!=====" << endl;
            vector<Team> m = search_zone(l);
            Approach_sequence(m);
            Call_system(m);
            break;
        }
        case 7:
        {
            
        }
        case 0:
            cout << "感谢你的使用!" << endl;
            return 0;
        default:
            cout << "选项输入错误,请重新输入!" << endl;
            break;
        }
        cout << endl;
    }
    std::system("PAUSE");
    return 0;
}

总结

以上便是本次数据结构课设的预习日志,记录学习过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值