数据结构课设——赛事管理系统 之 预习日志

问题描述

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

解决以下问题:

  1. 能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
  2. 从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
  3. 能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
  4. 为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)
  5. 赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。

问题分析

数据结构的设计

思考: 将参赛队信息设计成class还是struct?
分析: 将参赛队节点设计成struct,将参赛队信息表使用容器vector存储

vector 是表示可变大小数组的序列容器,也就是顺序表

思考: 将参赛队编号设计成int还是vector?
分析: 若使用int,便于查找,但不便于输入二叉排序树查找;构造一个int转vector的函数vector<int> int2vector(int num)

数据结构如下:

struct team
{
	vector<int> id;			// 参赛队编号    
	string name;			// 参赛作品名称    
	string school;			// 参赛学校    
	string category;		// 赛事类别    
	string participant;		// 参赛者    
	string teacher;			// 指导老师
};

基本数据

// 参赛队信息
const string TeamInfo[6] = { "参赛队编号","参赛作品名称","参赛学校","赛事类别","参赛者","指导教师" };
// 决赛室分组
const string FinalsRoom[9] = { "大数据应用","信息可视化设计","人工智能应用","软件应用与开发","物联网应用",\
								"数媒动漫与短片","数媒静态设计","数媒游戏与交互设计","微课与教学辅助" };
// 11个地点导航
const string sites[siteNum] = { "西苑学生食堂","文体中心","南门","主田径场","东苑学生食堂","图书馆","文理大楼","计算机学院楼","海韵湖","北门","北苑教工餐厅" };

// 带权无向图的邻接矩阵,其值为两点间的距离
const int adjMatrix[siteNum][siteNum] = {
        {INF, 80, INF, 70, INF, INF, INF, INF, INF, INF, INF},
        { 80,INF,70,50,INF,INF,INF,INF,INF,INF,INF },
        { INF,70,INF,90,240,INF,INF,INF,INF,INF,INF },
        { 70,50,90,INF,INF,160,80,INF,INF,INF,INF },
        { INF,INF,240,INF,INF,30,INF,INF,INF,INF,INF },
        { INF,INF,INF,160,30,INF,80,90,45,INF,180 },
        { INF,INF,INF,80,INF,80,INF,80,INF,INF,INF },
        { INF,INF,INF,INF,INF,90,80,INF,60,100,INF },
        { INF,INF,INF,INF,INF,45,INF,60,INF,40,20 },
        { INF,INF,INF,INF,INF,INF,INF,100,40,INF,50 },
        { INF,INF,INF,INF,INF,180,INF,INF,20,50,INF }
};

第1问

1. 问题

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

2. 分析

对顺序表vector的增删改

  • 增: 使用vector的push_back函数
  • 删: 使用vector的erase函数,当然删除的前提是查找到
  • 查: 利用find函数
  • 改: 修改的前提是查找到
3. 思考
  • 假设:

    • 简单查找部分仅根据参赛队编号进行查找;并假设输入编号正确
  • 增加

    • 增加的信息如何得到?
      分析: 新增输入信息的函数
    • 如何加入txt文件?
      分析: 将需要加入的队伍信息转化为文本内容
  • 修改

    • 修改哪部分信息?
      分析: 方法1,“是否进行修改”;方法2,选择修改,需要进行判断什么时候不再修改;
    • 如何修改txt文件?
      分析: 对文本内容进行修改,然后进行覆盖
  • 查找

    • 利用什么数据查找?
      分析: 仅根据参赛队编号进行查找
      补充: 查找到后返回下标值
    • 如何对txt文件进行查找?
      分析: 可以根据编号先找到“所在行”,然后删除该行
  • 文件读写

    • 读取每一行数据,将文本内容转化为队伍信息
    • 将一行队伍信息转化为文本内容
4. 函数声明
void inputTeamInfo(team* t) ;	// 参赛队伍信息输入
int findTeamById(int search_id);// 查找参赛队信息
void addTeamInfo();				// 增加参赛队伍信息
void eraseTeamInfo(int id);		// 根据参赛队编号进行删除

int TeamInfo_chose(int* teamInfo_chose);					// 选择需要修改的参赛队信息,返回的是修改的信息个数
void inputTeamInfo_given(int loc, int teamInfo_chose);		// 对指定信息进行输入
void inputTeamInfo_modify(int loc, int* teamInfo_chose, int teamInfo_countNum);// 参赛队伍信息输入(用于修改)
void modifyTeamInfo();										// 修改参赛队信息

void Init();	// 初始化(读取txt文件)

void str2teamInfo(string content, team& teamInfo);			// 读取每一行数据content,将文本内容转化为队伍信息teamInfo
string teamInfo2str(const team& teamInfo);					// 将队伍信息teamInfo转化为文本内容
5. TODO

要点:

已验证该功能

对文件的操作:

  • 读取所有
  • 读取指定行
  • 增加一行
  • 删除指定行
  • 修改指定行

已验证该功能

要求:

  • 对txt文件的读写
  • 写出基本框架
  • 设计“交互系统”

第2问

1. 问题

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

2. 理解要求
  • 将所有参赛队编号进行二叉排序树构建
  • 输入一支参赛队的编号
3. 分析
  • 从team.txt中读取参赛队伍的基本信息(已在第1问完成)
  • 实现基于二叉排序树的查找
    • 将参赛队信息放入二叉排序树
    • 输入参赛队编号,然后基于二叉排序树查找
4. 代码框架
4.1 定义二叉排序树节点
struct BSTNode
{
    int data; //数据域
    BSTNode* left, * right; //左右子树指针
};
4.2 函数声明
BSTNode* createBST(BSTNode* root, int data);	// 创建二叉排序树
int searchBST(BSTNode* root, int data);			// 查找二叉排序树
float getASL(BSTNode* root, int* nums, int n);	// 计算二叉排序树的ASL

BSTNode* createBST_TeamInfo();					// 将参赛队编号放入二叉排序树
void searchBST_TeamInfo();						// 基于二叉排序树,根据输入的编号查找参赛队
5. 测试完成
  • 将参赛队信息放入二叉排序树
  • 输入参赛队编号,然后基于二叉排序树查找

测试结果
在这里插入图片描述

第3问

1. 问题

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

2. 分析
  • 输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息
  • 输出的参赛团队按赛事类别有序输出
3. 函数声明
void sortTeam_BySchool(); // 输入参赛学校名称,输出的参赛团队按赛事类别有序输出
4. 测试完成(有点小问题)
  • 输出的参赛团队按赛事类别有序输出

测试结果:
在这里插入图片描述

第4问

1. 问题

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

2. 9个决赛室
	1. 大数据应用
		* 大数据实践
	2. 信息可视化设计
		* 信息图形设计
		* 动态信息影像(MG 动画) 
		* 交互信息设计
		* 数据可视化
	3. 人工智能应用
		* 人工智能实践赛(普通赛道)
	4. 软件应用与开发
		* Web 应用与开发
		* 管理信息系统
		* 算法设计与应用
		* 移动应用开发(非游戏类)
	5. 物联网应用
		* 医药卫生
		* 行业应用
		* 数字生活
		* 城市管理
		* 运动健身
	6. 数媒动漫与短片(普通组)
		* 动画
		* 纪录片
		* 数字短片
		* 微电影
		* 新媒体漫画
	7. 数媒动漫与短片专业组
		* 动画
		* 纪录片
		* 数字短片
		* 微电影
		* 新媒体漫画
	8. 数媒静态设计(普通组)
		* 产品设计
		* 环境设计
		* 平面设计
	9. 数媒静态设计专业组
		* 产品设计
		* 环境设计
		* 平面设计
	10.	数媒游戏与交互设计(普通组)
		* 交互媒体设计
		* 虚拟现实 VR 与增强现实 AR
		* 游戏设计
	11. 数媒游戏与交互设计专业组
		* 交互媒体设计
		* 虚拟现实 VR 与增强现实 AR
		* 游戏设计
	12. 微课与教学辅助
		* 汉语言文学(唐诗宋词)微课
		* 计算机基础与应用类课程微课
		* 虚拟实验平台
		* 中、小学数学或自然科学课程微课
3. 分析
  • 所有参赛队按赛事组织文件中的赛事类别分到9个决赛室(按决赛通知上的9个分组

  • 决赛室按顺序叫号

    • 叫号顺序没有规定,自己规定:根据参赛作品编号从小到大进行叫号,因此需要排序
4. 小任务点
  • 分到9个决赛室:根据赛事类别(其中包括9个大类别,要根据每个小类别判断大类别)
  • 实现按队伍编号从小到大进行叫号
  • 模拟叫号系统,即界面设计

    不知道叫号系统应该设计成什么样

注:模拟叫号功能已测试
在这里插入图片描述
每个决赛室的队伍数量不一样:19,36,45,66,33,44,66,29,59

5. 函数声明
void QueueSystem();				// 模拟叫号和进场过程
void QueueSystem_Interface();	// 模拟叫号界面展示
void assignRoom(vector<vector<team>> &Rooms);	// 将参赛队按赛事类别分到不同的决赛室
void sortRoom(vector<vector<team>>& Rooms);		// 决赛室按参赛队编号从小到大的顺序排序

第5问

1. 问题

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

2. 分析

重点: 考查带权无向图的最短路径查找(Dijkstra算法/Floyd弗洛伊德算法)

  • 首先,肯定要画出地图,即带权无向图
  • 将地图信息用无向图保存,即定义邻接矩阵
  • 根据最短路径寻找算法,将得到最短路径,并输出提示
3. 地图绘制

参考地图:
地图

[1]西苑学生食堂 [2]文体中心 [3]南门 [4]主田径场 [5]东苑学生食堂 [6]图书馆 [7]文理大楼 [8]计算机学院楼 [9]海韵湖 [10]北门 [11]北苑教工餐厅

带权无向图:
在这里插入图片描述

4. 代码框架
4.1 定义邻接矩阵
#define siteNum 11		// 表示导航地点数
#define INF 1e9         // 代表无穷大

const int adjMatrix[siteNum][siteNum] = {
        {INF, 80, INF, 70, INF, INF, INF, INF, INF, INF, INF},
        { 80,INF,70,50,INF,INF,INF,INF,INF,INF,INF },
        { INF,70,INF,90,240,INF,INF,INF,INF,INF,INF },
        { 70,50,90,INF,INF,160,80,INF,INF,INF,INF },
        { INF,INF,240,INF,INF,30,INF,INF,INF,INF,INF },
        { INF,INF,INF,160,30,INF,80,90,45,INF,180 },
        { INF,INF,INF,80,INF,80,INF,80,INF,INF,INF },
        { INF,INF,INF,INF,INF,90,80,INF,60,100,INF },
        { INF,INF,INF,INF,INF,45,INF,60,INF,40,20 },
        { INF,INF,INF,INF,INF,INF,INF,100,40,INF,50 },
        { INF,INF,INF,INF,INF,180,INF,INF,20,50,INF }
};
4.2 函数声明
void dijkstra(int start, int end);      // 根据起点start和终点end寻找最短路径
void navigation();						// 进行导航

测试成功
在这里插入图片描述

收尾工作

  • 解决报错
  • 功能测试
  • 设计叫号系统界面
  • 设计整个系统界面
  • 完善预习报告

整个系统界面设计

1. 系统要求梳理
  1. 参赛队伍信息的增加、删除、修改
  2. 参赛队伍信息的查找:输入参赛队编号,查找成功输出信息以及ASL;查找失败者输出“查找失败
  3. 按参赛学校查询参赛团队:输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法)
  4. 决赛叫号系统。分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。
  5. 校园导游程序,为参赛者提供各种路径导航的查询服务。提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。
2. 系统要求提取
  1. 参赛队伍信息的增加、删除、修改
  2. 参赛队伍信息的查找
  3. 按参赛学校查询参赛团队
  4. 比赛开始:决赛叫号系统
  5. 路径导航的查询服务
3. 实现思路

将各个功能封装为一个函数,用户输入功能选项,然后进行相应操作,具体是在main函数中采用switch分支来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值