问题描述
本次课程设计要求协助中国大学生计算机设计大赛江苏省组委会,设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理
解决以下问题:
- 能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
- 从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
- 能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
- 为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)
- 赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于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. 系统要求梳理
- 参赛队伍信息的增加、删除、修改
- 参赛队伍信息的查找:输入参赛队编号,查找成功输出信息以及ASL;查找失败者输出“查找失败
- 按参赛学校查询参赛团队:输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法)
- 决赛叫号系统。分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。
- 校园导游程序,为参赛者提供各种路径导航的查询服务。提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。
2. 系统要求提取
- 参赛队伍信息的增加、删除、修改
- 参赛队伍信息的查找
- 按参赛学校查询参赛团队
- 比赛开始:决赛叫号系统
- 路径导航的查询服务
3. 实现思路
将各个功能封装为一个函数,用户输入功能选项,然后进行相应操作,具体是在main函数中采用switch分支来实现