一、问题定义
系统名称:中国大学生计算机设计大赛省级赛事管理系统
五大具体问题:
1、基本信息管理。从team.txt中读取参赛队伍信息,实现管理各参赛队伍信息,包括基本的增、删、改操作。
2、信息查找系统1。基于二叉排序树的查找,实现通过输入参赛队编号查找参赛队伍基本信息的操作。若查找成功则输出查找时平均查找长度ASL;否则,输出“查找失败!”
3、信息查找系统2。可以根据提示输入参赛学校名称查找队伍信息,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队需按参赛队编号输出;否则,输出“查找失败!”
4、设计决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场。比赛结束后,下一参赛队才进赛场,各参赛队进场比赛时间设为0.5秒。
5、设计校园导游程序,为参赛者提供各种路径导航的查询服务。以长山校区提供比赛场地为例,提供10个目标地的导航,实现为参赛者提供校园地图中任意目标地相关信息的查询,提供图中任意目标地的问路查询,即查询任意两个目的地之间的一条最短的简单路径。
二、问题分析
1.基本信息管理
该需求的实现我们主要分为3步,具体步骤如下:
(1)创建合适的类存储队伍信息,并选择合适的数据结构存储信息。
(2)实现对.txt文件的读写,并把读出的数据存储在合适的数据结构中。
(3)依靠.txt的读写操作实现对.txt的增、删、改。
1>.增加参赛队信息:
接收用户输入的参赛队信息,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等。创建一个新的参赛队对象,并将输入的信息赋值给相应的属性。将新的参赛队对象添加到数据结构中。
2>.删除参赛队信息:
接收用户输入的参赛队编号或其他标识符。在数据结构中查找对应的参赛队对象。如果找到匹配的参赛队对象,将其从数据结构中删除。
3>.修改参赛队信息:
接收用户输入的参赛队编号或其他标识符。在数据结构中查找对应的参赛队对象。如果找到匹配的参赛队对象,提供用户选择要修改的属性。接收用户输入的新值,并将其赋值给相应的属性。
4>.错误处理:
针对可能出现的错误情况,如无效的输入或找不到对应的参赛队信息,提供适当的错误提示和处理机制。
(4)用户功能界面菜单设计。
设计一个用户界面,使用户可以与系统进行交互。提供选项让用户选择要执行的操作,如增加、删除和修改参赛队的信息。根据用户选择,调用相应的操作函数来执行相应的操作。
2.基于二叉排序树的查找
具体步骤:
1)使用参赛队编号作为关键字,将链表中的数据信息按参赛队编号放入二叉排序树中,构建二叉排序树(BST)。
为创建二叉排序树,我们先创建好二叉树的节点BST类,包括节点的定义以及二叉树节点的插入。在第一步的时候我们可以通过在主类中使用循环调用二叉树的插入函数实现链表到二叉排序树的转换。
将参赛队伍对象按照参赛队编号的大小顺序插入二叉排序树中。
2)实现查找,根据输入的参赛队编号,查找到对应的队伍后输出基本信息
由于构建的是二叉排序树,二叉排序树的中序遍历结果是从小到大排序的,第二步我们借用这个特点去寻找对应的参赛队信息。
二叉排序树的中序遍历:先遍历左子树,然后检查当前节点值,最后遍历右子树
3)计算平均查找长度ASL
ASL=∑(本层高度*本层元素个数)/节点总数
3.参赛团队查询
功能需求分析
1)根据给出的学校名称,找出所有参赛队伍
2)按照他们的参赛队伍编号进行排序(有序输出)
第一步我们可以先新建一个链表,存储满足条件的参赛队伍。然后遍历已存储了所有信息的链表,找出满足条件的队伍并把他们存入新的链表。
这里使用链表的原因主要是因为不确定每个学校参赛队伍数量的多少,链表可以动态分配空间,从一定程度上减少了空间资源的浪费。
第二步我们采用插入排序算法对新链表中元素进行排序来进行有序输出。
选择插入排序算法的主要原因在于,优点: 稳定,相对于冒泡排序与选择排序更快,在数据相对有序的情况下有较高的效率(只需遍历一次O (n))。 缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量大的时候,时间复杂度可能很高(全部反序O (n²))。
4.决赛叫号系统
具体步骤:
1)将所有队伍划分到每个决赛室里面
2)初始化各个决赛室的队伍队列,给每个队伍进行编号
3)每个决赛室开始依次叫号进行,等待比赛结束后,再叫号下一个参赛队伍进场。故采用多线程操作(互不影响的叫号操作)
5.校园导航
分析【设计要求】:
1)赛事数据要求存入文件(txt或excel)并能读入查询;
2)赛地目的地查询,需提供目的地(建筑物)名称、代号、简介等信息;最短路径的输出需包含途经地及最短路径值。
3)输入数据形式和范围:赛事相关数据可从键盘输入,或自文件导入。
4)界面要求:交互设计要合理,每个功能可以设计菜单,用户根据提示,完成相关功能的要求。
具体步骤:
1)将校园地图中所有建筑物基本信息及其之间的距离存储在图中
2)根据提示输入任意两个建筑物的名称,查询它们之间的最短路径,提供建筑物相关信息
-->校园导游程序实现在算法上面最关键功能是实现最短路径的规划,我们决定使用Dijkstra算法来实现最短路径的查询服务。使用Dijkstra算法的原因如下:
1>Dijkstra算法适用于求解正权有向图的单源最短路径,而我们需要求解的是校园中任意两个建筑物之间的最短路径,Dijkstra算法适用。
2>Dijkstra算法执行效率高,其时间复杂度是O(n^2),n为图中节点数。对于校园地图这样的小规模图,Dijkstra算法的运算速度可以满足需求。
3>Dijkstra算法保证对于非负边权的图,求解结果一定是正确的。在实际场景中,校园建筑物之间的距离或时间都是正数,这个保证在这个场景中是成立的。
4>对比另一种最短路径Floyd算法,Floyd主要用于计算多源最短路径,在本校园场景下,实现较为困难。
3)根据输入的建筑物名称输出相应的信息