问题定义
本次课程设计要求协助中国大学生计算机设计大赛江苏省组委会,设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理解决以下问题:
(1)能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
(2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。
(3)能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队),即,根据提示输入参赛学校名称(赛事类别),若查找成功,输出该学校参赛的(该赛事类别的)所有团队的基本信息,输出的参赛团队按赛事类别有序输出。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)
(4)为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,要能直观展示叫号顺序与进场秩序一致)
(5)赛事系统为参赛者提供赛地的校园导游程序,为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供任意两个目标地(建筑物)的导航查询,即查询任意两个目的地(建筑物)之间的一条最短路径。
问题分析
一.管理参赛队伍的基本信息
1)定义参赛队的数据结构:
- 创建一个类或结构体来表示参赛队的基本信息。
- 定义属性,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等。
2)数据存储和管理:
- 设计一个适合存储参赛队信息的数据结构,如数组。
- 初始化一个空的数据结构来存储参赛队信息。
- 实现操作函数来增加、删除和修改参赛队的信息。
3)用户界面:
- 设计一个用户界面,使用户可以与系统进行交互。
- 提供选项让用户选择要执行的操作,如增加、删除和修改参赛队的信息。
- 根据用户选择,调用相应的操作函数来执行相应的操作
4)增加参赛队信息:
- 接收用户输入的参赛队信息,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等。
- 创建一个新的参赛队对象,并将输入的信息赋值给相应的属性。
- 将新的参赛队对象添加到数据结构中。
5)删除参赛队信息:
- 接收用户输入的参赛队编号或其他标识符。
- 在数据结构中查找对应的参赛队对象。
- 如果找到匹配的参赛队对象,将其从数据结构中删除。
6)修改参赛队信息:
- 接收用户输入的参赛队编号或其他标识符。
- 在数据结构中查找对应的参赛队对象。
- 如果找到匹配的参赛队对象,提供用户选择要修改的属性。
- 接收用户输入的新值,并将其赋值给相应的属性。
二.从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找
1)读取参赛队伍信息:
- 从文本文件(如team.txt)中读取参赛队伍的基本信息。
- 解析文本文件,将每个参赛队伍的信息提取出来,并创建相应的参赛队对象。
- 将参赛队伍对象存储在数据结构中,以便后续查找操作使用。
2)二叉排序树的构建:
- 使用参赛队编号作为关键字,构建二叉排序树。
- 将参赛队伍对象按照参赛队编号的大小顺序插入二叉排序树中。
3)查找参赛队伍信息:
- 提示用户输入要查找的参赛队编号。
- 在二叉排序树中进行查找操作,根据用户输入的参赛队编号找到相应的参赛队伍对象。
- 如果找到匹配的参赛队伍对象,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息)。
- 计算查找成功时的平均查找长度(ASL)并输出。
- 如果未找到匹配的参赛队伍对象,输出"查找失败!"的提示信息。
4)数据处理和分析:
- 对数据进行适当的处理和分析,如统计参赛队伍的数量、赛事类别的数量等。
- 可以利用数据结构和算法知识,进行其他有关数据的操作和分析,以满足具体需求。
三.能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队)
1)根据参赛学校查询参赛团队:
- 提示用户输入要查询的参赛学校名称。
- 遍历存储参赛队伍信息的数据结构,找到与输入的参赛学校名称匹配的参赛队伍对象。
- 输出该学校参赛的所有团队的基本信息,并按照赛事类别进行排序输出。
2)根据赛事类别查询参赛团队:
- 提示用户输入要查询的赛事类别。
- 遍历存储参赛队伍信息的数据结构,找到与输入的赛事类别匹配的参赛队伍对象。
- 输出该赛事类别的所有参赛团队的基本信息,并按照指定的排序算法对参赛团队进行排序输出(可选择选择排序、插入排序、希尔排序、归并排序、堆排序等)。
- 在选择排序算法时,对选择的原因进行说明。
3)排序算法选择和排序输出:
- 选择合适的排序算法来对参赛团队进行排序。例如,可以选择归并排序算法。
- 实现选择的排序算法,并对参赛团队按照赛事类别进行排序。
- 输出排序后的参赛团队基本信息,按照排序结果有序输出。
4)校验和错误处理:
- 在查询过程中,校验用户输入的参赛学校名称和赛事类别是否有效,如确保输入不为空或存在于参赛队伍数据中。
- 如果查询结果为空,输出相应的提示信息。
四.决赛叫号系统
1)设计决赛叫号系统:
- 根据赛事组织文件中的赛事类别,将参赛队伍分配到不同的决赛室。
- 创建一个队列数据结构来模拟决赛室中参赛队伍的顺序。
2)决赛叫号和参赛队进场:
- 按照指定的顺序(赛事类别),逐个决赛室进行叫号和参赛队伍进场。
- 输出当前叫号的参赛队伍信息,并将其从队列中移除。
- 等待比赛结束后,再叫号下一个参赛队伍进场。
3)模拟决赛叫号系统:
- 模拟整个决赛过程,包括参赛队伍的叫号和进场顺序。
- 可以通过时间间隔或手动操作来模拟比赛过程中的时间流逝。
4)直观展示叫号顺序和进场秩序:
- 在叫号时,输出当前叫号的参赛队伍信息,以展示叫号顺序。
- 在参赛队伍进场时,输出进场的参赛队伍信息,以展示进场秩序。
五.校园导游
概要设计
一个Team类,用于管理队伍的基本信息:
public class Team {
private int teamId;
private String projectName;
private String school;
private String category;
private String participants;
private String guideTeacher;
// 构造函数
public Team(int teamId, String projectName, String school, String category, String participants, String guideTeacher) {
this.teamId = teamId;
this.projectName = projectName;
this.school = school;
this.category = category;
this.participants = participants;
this.guideTeacher = guideTeacher;
}
// getter和setter方法
public int getTeamId() {
return teamId;
}
public void setTeamId(int teamId) {
this.teamId = teamId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getParticipants() {
return participants;
}
public void setParticipants(String participants) {
this.participants = participants;
}
public String getGuideTeacher() {
return guideTeacher;
}
public void setGuideTeacher(String guideTeacher) {
this.guideTeacher = guideTeacher;
}
}
BinarySearchTree
(二叉排序树)类,用于实现查找功能。
public class BinarySearchTree {
private Node root;
private class Node {
private Team team;
private Node left;
private Node right;
public Node(Team team) {
this.team = team;
this.left = null;
this.right = null;
}
}
public void insert(Team team) {
root = insertNode(root, team);
}
private Node insertNode(Node root, Team team) {
return root;
}
public Team search(int teamId) {
return searchNode(root, teamId);
}
private Team searchNode(Node root, int teamId) {
}
public void inOrderTraversal() {
inOrderTraversal(root);
}
private void inOrderTraversal(Node root) {
}
}
下面给出校园景点的无向带权图: