大赛项目设计

一、问题分析与任务定义
1.1问题描述和要求

【问题描述】

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

【设计要求】

    1)赛事数据要求存入文件(txt或excel)并能读入查询;

    2)赛地目的地查询,需提供目的地(建筑物)名称、代号、简介等信息;最短路径的输出需包含途经地及最短路径值。

    3)输入数据形式和范围:赛事相关数据可从键盘输入,或自文件导入。

    4)界面要求:交互设计要合理,每个功能可以设计菜单,用户根据提示,完成相关功能的要求。

1.2问题分析

该系统应该能够为省级赛事管理解决以下问题:

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

    (2)实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。请输出ASL(成功)的计算公式和结果值。
    (3)能够提供按参赛学询参Te赛团队,根据提示输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队需有序输出(按参赛队编号)。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)

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

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

二、逻辑设计

本课程设计采用java语言实现:
问题一:队伍信息管理

分析:

任务要求读取文件信息,并对各队伍信息进行管理,包括增加修改删除操作。
数据结构的选择

想到有顺序表,单链表,哈希表,有序表等;

顺序表的本质就是数组,数组组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大小,则会出现溢出现象,增加删除不方便,但顺序表可以实现随机查找;

单链表长度按实际需要是可以伸缩的,插入删除操作修改指针即可,但它不支持随机查找;

哈希表将需要查找的key值,通过hash函数的计算,换算为数组的位置值。这样在查找时就可以直接定位数据的位置。它结合了数组的快速查询的优点又能融合链表方便快捷的增加删除元素的优势但数组和链表都只需要在栈上存储一个起始位置,占用一个变量位置即可,hash将需要定位的值通过hash函数换算为数据的位置值,以空间换时间;

有序表基本操作与哈希表类似;它一个最大的优点是:可以对key的值进行排序,但它的时间性能比哈希表差;

综合考虑采用HashMap;对队伍信息进行增删改操作
文件信息读取

字节输入流—InputStream     字节输出流—OutputStream

字符输入流—Reader             字符输出流—Writer

给的txt文本文件,考虑字符的输入输出实现文本的读取与写入

文件信息按行分布,每行不同信息间用#分隔;考虑逐行读取文件信息,用split()将数据按#分隔成一个个字段,trim()再将字段前后空格也给去掉,最后把这些字段对应存储到team对象信息链表中。
队伍信息增删改
添加队伍信息    

public static void addTeam(HashMap<Integer, Team> team)
删除队伍信息    public static void delTeam(HashMap<Integer,Team> team)
修改队伍信息    public static void Change(HashMap<Integer,Team>team)
队伍信息呈现    

public void show(List<Team>teams)

队伍信息呈现

调用readFile()来读取文件信息以返回Team对象的列表再循环遍历列表中的每个对象元素(即每个队伍),并输出到控制台

增加队伍信息

Team实例对象,从控制台读取用户输入的信息,包括参赛队编号、作品名称、学校、赛事类别、参赛者和指导老师并将读取到的信息存储在对应的变量中;并判断该队伍是否已经存在HashMap中。如果不存在,则将新的队伍信息添加其中(以参赛编号为键,team对象为值),并且告知用户该队伍信息添加完成;否则,告知用户该队伍信息已经存在,避免添加重复信息。

删除队伍信息

从控制台读取用户输入。提示用户输入要删除的队伍编号,并通过get()方法获取对应的Team对象。如果该对象不为空,则调用remove()方法将其从team中删除,并告知用户已删除;如果该对象不存在,则向用户报错误提示信息。

修改队伍信息

从控制台读取用户输入。提示用户输入要修改的队伍编号,并通过get()方法获取对应的Team对象。如果该对象不为空,则继续提示用户输入要修改的具体信息(包括参赛作品名称、参赛学校、赛事类别、参赛者和指导老师),并根据用户输入的信息调用相应的setter方法进行修改并告知用户修改完成;如果用户输入的要修改的信息不在指定的选项中,则输出错误提示信息。
问题二:基于二叉排序树查找队伍信息

对于这个问题,首先还是得将读取的文件信息插入到排序树中,设立一个插入方法不断填充二叉排序树,并记录节点个数,根据参赛编号查询查询队伍信息,还需要建立查询方法,要输出查找成功时的平均查找长度,则需要记录各结点查找次数,最终得出,平均查找长度=总查找次数/结点个数
文件信息读取

同上,在原先TeamInfo类文件信息读取方法中添加将分隔好的各字段插入到二叉排序树中。
二叉查找编号对应队伍信息

二叉排序树或是一棵空的二叉树,或者是具有下列性质的二叉树:        

⑴ 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;        

⑵ 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;        

⑶ 它的左右子树也都是二叉排序树。

填充二叉排序树(插入)

insert接收队伍信息参数,调用insertTeam函数将这些信息封装成一个新的Team对 象并插入到二叉树中。在insertTeam函数中,首先判断当前节点是否为空,如果是,则创建一个新的Team对象并返回;否则,比较要插入的节点的order值与当前节点的order值,如果要插入的节点的order值小于当前节点的order值,则递归调用insertTeam函数插在左子树中;否则,插在右子树中,并记录插入信息节点个数最后返回当前节点;这样就使得所有信息对象都插入到二叉排序树中。

编号对应信息查询

search接收队伍编号参数,然后调用searchTeam函数在BST中查找该节点对象。

在searchTeam函数中,首先判断当前节点是否为空或者要查找的节点的order值是否等于当前节点的order值,如果是,则返回当前节点;否则,比较要查找的节点的order值与当前节点的order值,如果要查找的节点的order值小于当前节点的order值,则递归调用searchTeam函数在左子树中继续查找;同时记录查找次数,否则,递归调用searchTeam函数在右子树中继续查找。最后返回找到的节点,不为空的话控制台输出查找成功信息,和查找长度。

最终返回编号为指定order的对象信息。
二叉排序树填充    public void insert(int order, String work,String school,String sailei,String student,String teacher)
当前具体插入    public Team insertTeam(Team team,int order,String work,String school,String sailei,String student,String teacher)
 二叉排序树编号信息搜索    public Team search(int order)
 当前具体搜索    public Team searchTeam(Team team,int order)
 获取平均查找长度    public double getAsl()
获取当前节点查找长度    public int getAsl1()
信息查询    public void manage()
问题三:

要求能够输入参赛学校名称,若学校有对应的参赛赛团队,团队就要按编号有序输出。
数据结构的选择

这很明显用HashMap的键值对应关系比较便捷
排序算法的选择。

选择排序,最大的优点应该就是简单易懂,但它时间复杂度为O(n^2),对于大规模数据来说,效率是比较低的;插入排序和选择排序同理;希尔排序:比选择,插入快些。

这三个都是适用于小规模数据排序,且时间复杂度较高,暂不考虑。

归并排序和堆排序都适用于大规模数据,时间复杂度为O(nlogn),但堆排序的空间复杂度比归并排序低,归并排序是稳定的排序算法,即相同元素的相对位置在排序后不会改变。而堆排序不是稳定的排序算法,相同元素的相对位置可能会改变,虽然堆得实现难度较低,但考虑实际问题,最终选择归并排序。
按编号有序输出查询对象的队伍信息

读取文件中的数据,并将其添加到teams列表中,同时将该Team对象添加到teamMap中。遍历teamMap中的所有Team对象,如果某个Team对象的学校名称与传入的参数school相同,则将其添加到researchByschool列表中。对researchByschool列表进行排序操作,按照编号从小到大排序;

这里我没有用归并排序,我直接调用的是Comparator.comparing()方法来比较编号大小关系进行排序。归并排序是一种分治算法,它将一个大的列表分成若干个小的子列表,然后递归地对每个子列表进行排序,最后将排好序的子列表合并成一个有序的列表;而我使用的这个它通过Lambda表达式和Stream API提供的一系列操作,将一个大的列表转换成一个小的流,然后对这个小流进行排序,最后再将排序后的小流转换回List。这种方式不需要创建中间数组,因此在处理大量数据时更加高效。

public List<Team> researchByschool(String school)
    按参赛学校查询并按编号有序排列
public void manage()    查询信息管理

问题四:

要求设计模拟决赛叫号过程,设计一个队列数据结构来模拟参赛队伍的进场顺序;将参赛队伍分配到不同的决赛室,按照顺序将参赛队的编号加入到叫号队列中模拟叫号程序;每隔一段时间进行下一次叫号(0.5s),直到队列为空表示都决赛过了,结束。结合team.txt文件和赛事安排文件,一共有九个大类,各大类下划分小类别,九个决赛分别进行九个大类的决赛事项,类别相同的决赛队伍尽量一同进行决赛。
数据结构选择

队列

模拟的是队伍进出场现场,很自然想到队列。
决赛安排表    public static final String[][] typesAndEntrances
决赛室队伍分配    public void allocationTeam()
决赛室队列填充    public void addTeamqueue(int roomorder,Team team)
决赛叫号管理    public void call()
问题五:

该模块要求有学校简介,景点介绍,和地点导航三个部分,学校简介定义一个方法输出即可,景点介绍同理,地点导航即要求输入任意目的地起始地,能够给出最短路径,和路径距离,这是一个图论问题-无向图,景点-顶点;路径-边,路径长度-边的权值;
数据结构选择

对于图的存储结构而言,图中各个景点的存储结构有邻接表和邻接矩阵两种存储结构,在处理大型稀疏图时,邻接矩阵比邻接表更节省内存空间;而在处理小型稠密图时,邻接表则更加高效,考虑到四通八达的学校实际环境,选择邻接表来表示图。

至于要求任意两景点最短路径,而且要记录输出路径,我选择Dijkstra算法,求单源点最短路径,起始地目的地手动输入,能够完成找到任意两景点最短路径的方法。
校园介绍    public static void SchoolInfo()
景点介绍    public static void JingdianInfo()
导航管理    public void manage()
 从未访问结点中找距离最近的结点    public int findShortest(double[]length,boolean[]visited)
生成起点到其他结点的最短路径    public void shortestPath(MGraph graph,int source)
到目的地最短距离    public double getShortestlength(int destination)
到目的地最短路径    public List<Integer> getPath(int destination)

最后设置主菜单和模块分菜单将这五个模块功能衔接起来,赛事管理系统基本框架应该就差不多了。

 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值