1、问题定义
1、参赛队伍基本信息的管理
2、 对基于排序二叉树对参赛队伍进行相关查找
3、基于参赛学校来查询参赛团队
4、叫号系统
5、导航系统
2、问题分析
第一步, 首先要确定存储参加比赛的队伍的基本信息的存储结构。因为每个参赛队伍的基本信息包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者、指导老师等11项,因此这里应选择定义一个结构体Team来存储每个参赛队的基本信息。
此外,因为参加比赛的队伍不止一个,并且在大赛报名截止前我们不知道到底有多少个参赛队伍,因此,这里选择vector容器来动态存储参赛队伍的基本信息。
最后定义一些相关的函数来管理参赛队伍的基本信息,这些操作包括增加、删除、修改参赛队伍的信息。
第二步,将“team.txt”文件导入到程序中,然后根据每队的参赛编号大小将其存储到二叉排序树中,再根据输入的参赛队的编号进行查找。因此需要定义一个存储二叉树的结构体。当成功找到该参赛队伍时,对该队伍的相关信息进行输出,并计算平均查找长度ASL;否则,输出“查找失败”的提示。
第三步,定义一个可以根据参赛学校来查找参赛团队的函数,若查找成功则输出该参赛团队;此外,为了使输出的参赛团队有序,应选择合适的算法对其进行相关排序。在第二步时,已经创建了一个基于参赛队编号的二叉排序树来存储所有参赛队的基本信息,因此,这里我将选择基于参赛队编号的有序来输出查找成功的参赛团队。将二叉排序树的数据按照中序遍历的顺序放到一个动态数组中,并将其进行排序。由于归并排序是在最坏情况下时间复杂度也比较小,因此我选择归并排序来对参赛团队按照参赛队编号来排序。
第四步,叫号系统,将进行相关操作前后的参赛队按照参赛队编号大小进行排序,之后再对参赛队进行分组,对照排好序的参赛队按照顺序,每45个队伍为一组是同一个决赛室依次进入同一个队列;分好组后,每次九个决赛室分别叫它们对应的参赛队列的第一个参赛队进入决赛室进行比赛,直到所有参赛队都被叫到后结束。
第五步,导航系统,将地图中的相关信息存储到一个结构体中,并根据地图的数据对其初始化。此后运用Dijkstra算法寻找两个地点之间的最短路径,并算出其最短路径的距离,再打印出其最短路径。
3、概要设计
数据结构设计
定义一个结构体Team,Team中包含参赛队伍的基本信息项,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者、指导老师。
// 参赛队伍的基本信息
struct Team {
string number; //参赛队编号
string workname; // 参赛作品名称
string school; // 参赛学校
string category; // 赛事类别
string contestion; //参赛者
string instructor; //指导老师
};
定义一个二叉排序树的节点类型
// 二叉排序树结构体定义
struct BiTNode {
Team data;
BiTNode* lchild, * rchild;
};
定义一个类——TeamManager,对参赛队伍信息进行相关操作。
// 管理参赛队伍的类
class TeamManager {
public:
// 添加一个参赛队
void add_team(const Team& team);
//添加一组参赛队
void add_teams(vector<Team> team1);
// 根据参赛队编号查找参赛队,并返回该队伍在数组中的下标,返回-1表示未找到
int find_team(const string& name);
//根据参赛队编号修改参赛队信息
void change1(string& number);
// 根据参赛队编号删除参赛队伍
void remove_team(const string& number);
// 显示所有参赛队伍的基本信息
void show_teams();
//在二叉树中插入节点
void Insert(TreeNode*& root, Team x);
//将根据数组元素构造一棵二叉排序树
TreeNode* ArrayToBST();
//中序遍历二叉排序树
void Inorder(TreeNode* root, vector<Team>& nums);
// 在二叉排序树中查找特定元素
double search(TreeNode* root, Team& value, double depth = 0);
//计算节点的深度
double depth(TreeNode* root, Team value, double depth = 0);
// 计算二叉排序树查找成功时的平均查找长度ASL
double calculateASL(TreeNode* node) ;
//基于参赛学校的查找
void fund(string school);
// 参赛队类
class Contestant {
public:
int id; // 参赛队编号
int type; // 参赛队类别
};
// 决赛室类
class FinalRoom {
private:
queue<Contestant> contestants; // 参赛队列
public:
// 将参赛队加入队列
void add(Contestant contestant);
// 叫号,并返回被叫号的参赛队编号,如果队列为空则返回-1表示无人可叫
int callNext();
};
//叫号
void call();
//要修改的操作
void change();
private:
vector<Team> teams; // 存储所有参赛队伍的数组
};
定义相关函数来实现导航的功能
//定义从一个节点类
class Node {
public:
Node()
{
minL = 1000; //初始化最短路径为无穷大。
}
string node; //节点名称
int minL; //当前节点的最短路径
Node* last; //下一个节点
};
//最短路径函数的递归打印
void print(Node* node);
//找到最短路径
void fundshort();
如下是实现读取txt文件等功能的相关函数代码
//从txt读取文件读取到数组中
void read(vector<Team>& teams);
//将txt文件中的空格全部去掉
void deletekongge(vector<Team>& teams);
//归并排序
void insertionSort(vector<Team>& arr);
//屏幕输入提示
void run(TeamManager& manager);
在导航系统中的相关地图如下: