一、参赛队伍管理
从team.txt中读取参赛队伍的基本信息,能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
1、问题分析
定义参赛队的数据结构
创建一个类或结构体来表示参赛队的基本信息,定义属性,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师。
(1)数据存储和管理
设计一个适合存储参赛队信息的数据结构,如列表、数组或字典,并初始化一个空的数据结构来存储参赛队信息,通过实现操作函数来增加、删除和修改参赛队的信息。
(2)读取参赛队伍信息
从文本文件(如team.txt)中读取参赛队伍的基本信息初始化一个空的数据结构来存储参赛队信息,解析文本文件,将每个参赛队伍的信息提取出来,并创建相应的参赛队对象,并将参赛队伍对象存储在数据结构中,以便后续查找操作使用。
(3)用户界面
设计一个用户界面,使用户可以与系统进行交互,满足人机交互的要求,提供选项让用户选择要执行的操作,如增加、删除和修改参赛队的信息,并根据用户选择,调用相应的操作函数来执行相应的操作。
(4)增加参赛队伍信息
接收用户输入的参赛队信息,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师,创建一个新的参赛队对象,并将输入的信息赋值给相应的属性并将新的参赛队对象添加到数据结构中。
(5)修改参赛队伍信息
接收用户输入的参赛队编号,在数据结构中查找对应的参赛队对象,如果找到匹配的参赛队对象,提供用户选择要修改的属性,接收用户输入的新值,并将其赋值给相应的属性。
(6)删除参赛队伍信息
接收用户输入的参赛队编号,在数据结构中查找对应的参赛队对象,如果找到匹配的参赛队对象,将其从数据结构中删除。
(7)错误处理
针对可能出现的错误情况,如无效的输入或找不到对应的参赛队信息,提供适当的错误提示和处理机制。
2、算法分析
参赛队伍结构体:Team类:表示参赛队伍的基本信息,包含参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等属性。这些属性需要提供相应的构造方法和访问器方法。除此之外,还可以实现其他辅助方法和逻辑。
使用用ifstream函数读取信息,使用以teams命名的vector(不用再初始化就必须制定大小的边长数组)容器存储读取的信息,以便后续的增加、修改、删除操作,同时需要注意分隔符“#”的读取,最后需要使用close()关闭文件再返回teams。
设计一个用户界面使得用户与系统可以进行交互。用户在菜单栏输入相选项,系统将会输出相对于的操作。(这里使用printf而不是cout是为了美观,能完整地输出菜单框)在主函数中对displayMune进行调用。
构建二叉排序树节点BSTNode,并且构建二叉排序树:创造一个新的节点,并初始化这个新节点。如果根节点指向空,就讲这个新节点赋给根节点;如果根节点不指向空,那么再次进行比较:如果team引用的teamID小于当前指针指向的teamID且当前指针指向的左节点指向空,就将新节点赋给当前左节点,否则当前指针继续左移;如果team引用的teamID大于当前指针指向的teamID且当前指针指向的右节点指向空,就将新节点赋给当前右节点,否则当前指针继续右移。最后返回根节点root。
增加参赛队伍的信息:在主函数中用Switch case 1增加参赛队伍信息,使用Team newTeam,然后输出用户需要进行的操作,并通过getline函数获得用户输入的信息后添加到新队伍teams向量中,最后使用releaseBST和buildBST重新构建二叉树。最后输出“参赛队伍信息添加成功!”。
修改参赛队伍信息:在主函数中用Switch case 2修改参赛队伍信息。使用modifyTeamID,先输出对用户的提示,使用getline函数获得用户输入的参赛队编号,然后使用find_if函数遍历有teams.begin()到teams.end()在teams向量中查找要修改的队伍,查找成功后进行相对于的修改操作。修改成功后输出“参赛队伍信息修改成功!”。否则,输出“未找到要修改的参赛队伍!”。
删除参赛队伍信息:在主函数中用Switch case 3删除参赛队伍信息。使用deleteTeamID函数,先输出对用户的提示,使用getline函数获得用户输入的参赛队编号,然后使用find_if函数遍历由teams.begin()到teams.end()在teams向量中查找要删除的队伍,查找成功后进行相对于的删除操作(erase())。最后使用releaseBST和buildBST重新构建二叉树。最后输出“参赛队伍信息删除成功!”。否则,输出“未找到要删除的参赛队伍!”。
二、基础二叉树的查找
实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。请输出ASL(成功)的计算公式和结果值。
1、问题分析
二叉排序树的构建
使用参赛队编号作为关键字,构建二叉排序树(BST),将参赛队伍对象按照参赛队编号的大小顺序插入二叉排序树中。
(1)查找参赛队伍信息
提示用户输入要查找的参赛队编号,在二叉排序树中进行查找操作,根据用户输入的参赛队编号找到相应的参赛队伍对象,如果找到匹配的参赛队伍对象,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),计算查找成功时的平均查找长度(ASL)并输出,如果未找到匹配的参赛队伍对象,输出"查找失败!"的提示信息。
(2)数据处理和分析
对数据进行适当的处理和分析,如统计参赛队伍的数量、赛事类别的数量等,可以利用数据结构和算法知识,进行其他有关数据的操作和分析,以满足具体需求。
2、算法设计
构建二叉排序树节点BSTNode,并且构建二叉排序树:创造一个新的节点,并初始化这个新节点。如果根节点指向空,就讲这个新节点赋给根节点;如果根节点不指向空,那么再次进行比较:如果team引用的teamID小于当前指针指向的teamID且当前指针指向的左节点指向空,就将新节点赋给当前左节点,否则当前指针继续左移;如果team引用的teamID大于当前指针指向的teamID且当前指针指向的右节点指向空,就将新节点赋给当前右节点,否则当前指针继续右移。最后返回根节点root。
计算二叉树的节点个数:如果根节点指向空,则返回0,如果不指向空,会返回1+左节点的个数累加+又节点的个数累加。查找到队伍信息后会进行ASL的计算:所有节点的平均查找长度累加除以节点个数398。
三、参赛团队查询
能够提供按参赛学校查询参赛团队,根据提示输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队需有序输出(按参赛队编号)。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
1、问题分析
根据参赛学校查询参赛团队
提示用户输入要查询的参赛学校名称,遍历存储参赛队伍信息的数据结构,找到与输入的参赛学校名称匹配的参赛队伍对象,输出该学校参赛的所有团队的基本信息,并按照参赛队编号进行排序输出。
排序算法的选择和排序输出
选择合适的排序算法来对参赛团队进行排序。例如,可以选择归并排序算法,实现选择的排序算法,并对参赛团队按照赛事类别进行排序,输出排序后的参赛团队基本信息,按照排序结果有序输出。
校验与错误处理
在查询过程中,校验用户输入的参赛学校名称是否有效,如确保输入不为空或存在于参赛队伍数据中,如果查询结果为空,输出相应的提示信息。
2、算法设计
选择排序算法进行排序:第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换; 第二轮从下标为 2 到下标为 n - 1 的元素中选取最小值,若小于第二个数,则交换;依次类推下去…
按照输入的参赛学校查询到参赛团队后,按照直接排序算法将参赛队编号有序输出。
四、决赛叫号模拟
为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,各参赛队进场比赛时间可设为0.5秒)
1、问题分析
设计决赛室
使用互斥量mutex表示一个决赛室只能有一支参赛队伍,使用simulateFinalRoom模拟参赛室,将参赛队伍分配到不同的参赛室。
决赛叫号和参赛队进场
读取txt文件中的信息,模拟参赛队进场比赛,等待一段时间,sleep_for休眠函数,表示当前线程不与其他线程竞争CPU,睡眠500毫秒,即0.5秒。
模拟决赛叫号系统
创建线程来模拟各个决赛室的叫号系统,使用for循环遍历finalRooms向量中的每个元素,表示每个决赛室,检查当前决赛室中团队的数量是否大于1,如果是则创建一个线程来模拟该决赛室的叫号系统。一共九个线程来模拟九个决赛室。
直观展示叫号顺序
cout << "[" << roomName << "] 叫号:" << team << endl;
2、算法设计
使用互斥量mutex表示一个决赛室只能有一支参赛队伍,使用simulateFinalRoom模拟参赛室,将参赛队伍分配到不同的参赛室,用this_thread::sleep_for(milliseconds(500)) 模拟参赛队进场比赛,等待一段时间,sleep_for休眠函数,表示当前线程不与其他线程竞争CPU,睡眠500毫秒,即0.5秒。
创建名为finalRooms的二维字符串向量,用于存储读取的信息,创建名为line的字符串向量,用于存储从文件中读取的每一行内容;使用getline函数逐行读取文件内容,直到文件末尾。创建名为teamInfo的字符串向量,用于存储每个团队的信息;创建名为pos的size_t类型变量,用于存储字符串中字符的位置。使用find函数查找行中的"#"字符的位置,如果找到则进入循环;使用substr函数从行中提取从位置0到pos的子字符串,并将其存储在token变量中。将token添加到teamInfo向量中,行中删除已提取的部分,包括"#"字符,如果行不为空,将剩余的部分作为一个独立的字符串添加到teamInfo向量中,将teamInfo向量添加到finalRooms向量中,表示一个团队的完整信息已经读取完毕,创建名为threads的线程向量,用于存储模拟各个决赛室叫号系统的线程。
创建线程模拟决赛叫号系统,直观输出。
五、校园导航
赛事系统为参赛者提供赛地的校园导游程序。为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供图中任意目标地(建筑物)的问路查询,即查询任意两个目的地(建筑物)之间的一条最短的简单路径。
1、问题分析
校园导游程序设计
准备校园地图和建筑物的相关信息,包括建筑物名称、位置坐标等,设计一个路径导航功能,使参赛者能够查询从一个建筑物到另一个建筑物的最短路径。
提供建筑物相关信息的查询服务
提示用户输入要查询的建筑物名称,根据用户输入的建筑物名称,在校园地图中查找相应的建筑物信息,输出建筑物的相关信息,如名称、位置坐标等。
提供任意两个目标地的导航查询
提示用户输入起始建筑物和目标建筑物的名称,利用合适的算法(如最短路径算法,如Dijkstra算法)计算起始建筑物到目标建筑物的最短路径,输出最短路径上的建筑物信息,以指导参赛者从起始建筑物到目标建筑物的导航。
校验和错误处理
在查询过程中,校验用户输入的建筑物名称是否有效,如确保输入不为空或存在于校园地图数据中,处理可能出现的错误情况,如无效的起始建筑物或目标建筑物、无法到达目标建筑物等,处理可能出现的错误情况,如无效的起始建筑物或目标建筑物、无法到达目标建筑物等。
2、算法设计
初始化图,输入相应的景点信息以及顶点之间的边长,初始化图的邻接矩阵。
下面给出校园景点的无向带权图以及江苏科技大学长山校区的地图:
地图一
地图二
可以制作如下带权图:
输出图的邻接矩阵的值,用Floyd算法输出最短路径。
Floyd算法:动态规划算法。设找从点i到点j的最短路径。从i到j的最短路径2种可能,一是直接从i到j,二是从i经过若干个节点k到j。假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),当遍历完所有节点k,Dis(i,j)中记录的是i到j的最短路径的距离。