计算机设计大赛管理系统数据结构预习报告

1.问题摘要

  1. 管理各参赛队的基本信息(增删改查)
  2. 从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找
  3. 能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队)
  4. 决赛叫号系统
  5. 校园导游

2.问题分析 

1)管理各参赛队的基本信息(增删改查)

  1. 定义参赛队的数据结构:

    • 创建一个类或结构体来表示参赛队的基本信息。
    • 定义属性,如参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等。
  2. 数据存储和管理:

    • 设计一个适合存储参赛队信息的数据结构,如列表、数组或字典。
    • 初始化一个空的数据结构来存储参赛队信息。
    • 实现操作函数来增加、删除和修改参赛队的信息。
  3. 用户界面:

    • 设计一个用户界面,使用户可以与系统进行交互。
    • 提供选项让用户选择要执行的操作,如增加、删除和修改参赛队的信息。
    • 根据用户选择,调用相应的操作函数来执行相应的操作。
  4. 增加参赛队信息:

    • 接收用户输入的参赛队信息,包括参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等。
    • 创建一个新的参赛队对象,并将输入的信息赋值给相应的属性。
    • 将新的参赛队对象添加到数据结构中。
  5. 删除参赛队信息:

    • 接收用户输入的参赛队编号或其他标识符。
    • 在数据结构中查找对应的参赛队对象。
    • 如果找到匹配的参赛队对象,将其从数据结构中删除。
  6. 修改参赛队信息:

    • 接收用户输入的参赛队编号或其他标识符。
    • 在数据结构中查找对应的参赛队对象。
    • 如果找到匹配的参赛队对象,提供用户选择要修改的属性。
    • 接收用户输入的新值,并将其赋值给相应的属性。
  7. 错误处理:

    • 针对可能出现的错误情况,如无效的输入或找不到对应的参赛队信息,提供适当的错误提示和处理机制。

 2)从team.txt中读取参赛队伍的基本信息,实现基于二叉排序树的查找

  1. 读取参赛队伍信息:

    • 从文本文件(如team.txt)中读取参赛队伍的基本信息。
    • 解析文本文件,将每个参赛队伍的信息提取出来,并创建相应的参赛队对象。
    • 将参赛队伍对象存储在数据结构中,以便后续查找操作使用。
  2. 二叉排序树的构建:

    • 使用参赛队编号作为关键字,构建二叉排序树(BST)。
    • 将参赛队伍对象按照参赛队编号的大小顺序插入二叉排序树中。
  3. 查找参赛队伍信息:

    • 提示用户输入要查找的参赛队编号。
    • 在二叉排序树中进行查找操作,根据用户输入的参赛队编号找到相应的参赛队伍对象。
    • 如果找到匹配的参赛队伍对象,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息)。
    • 计算查找成功时的平均查找长度(ASL)并输出。
    • 如果未找到匹配的参赛队伍对象,输出"查找失败!"的提示信息。
  4. 数据处理和分析:

    • 对数据进行适当的处理和分析,如统计参赛队伍的数量、赛事类别的数量等。
    • 可以利用数据结构和算法知识,进行其他有关数据的操作和分析,以满足具体需求。

3)能够提供按参赛学校查询参赛团队(或根据赛事类别查询参赛团队) 

  1. 根据参赛学校查询参赛团队:

    • 提示用户输入要查询的参赛学校名称。
    • 遍历存储参赛队伍信息的数据结构,找到与输入的参赛学校名称匹配的参赛队伍对象。
    • 输出该学校参赛的所有团队的基本信息,并按照赛事类别进行排序输出。
  2. 根据赛事类别查询参赛团队:

    • 提示用户输入要查询的赛事类别。
    • 遍历存储参赛队伍信息的数据结构,找到与输入的赛事类别匹配的参赛队伍对象。
    • 输出该赛事类别的所有参赛团队的基本信息,并按照指定的排序算法对参赛团队进行排序输出(可选择选择排序、插入排序、希尔排序、归并排序、堆排序等)。
    • 在选择排序算法时,对选择的原因进行说明。
  3. 排序算法选择和排序输出:

    • 选择合适的排序算法来对参赛团队进行排序。例如,可以选择归并排序算法。
    • 实现选择的排序算法,并对参赛团队按照赛事类别进行排序。
    • 输出排序后的参赛团队基本信息,按照排序结果有序输出。
  4. 校验和错误处理:

    • 在查询过程中,校验用户输入的参赛学校名称和赛事类别是否有效,如确保输入不为空或存在于参赛队伍数据中。
    • 如果查询结果为空,输出相应的提示信息。

 

4)决赛叫号系统 

  1. 设计决赛叫号系统:

    • 根据赛事组织文件中的赛事类别,将参赛队伍分配到不同的决赛室。
    • 创建一个队列数据结构来模拟决赛室中参赛队伍的顺序。
  2. 决赛叫号和参赛队进场:

    • 按照指定的顺序(赛事类别),逐个决赛室进行叫号和参赛队伍进场。
    • 输出当前叫号的参赛队伍信息,并将其从队列中移除。
    • 等待比赛结束后,再叫号下一个参赛队伍进场。
  3. 模拟决赛叫号系统:

    • 模拟整个决赛过程,包括参赛队伍的叫号和进场顺序。
    • 可以通过时间间隔或手动操作来模拟比赛过程中的时间流逝。
  4. 直观展示叫号顺序和进场秩序:

    • 在叫号时,输出当前叫号的参赛队伍信息,以展示叫号顺序。
    • 在参赛队伍进场时,输出进场的参赛队伍信息,以展示进场秩序。
  5. 错误处理和边界情况:

    • 处理可能出现的错误情况,如无效的数据、队列为空等。
    • 提供适当的错误提示和处理机制,确保决赛叫号系统的正常运行。

5)校园导游 

  1. 校园导游程序设计:

    • 准备校园地图和建筑物的相关信息,包括建筑物名称、位置坐标等。
    • 设计一个路径导航功能,使参赛者能够查询从一个建筑物到另一个建筑物的最短路径。
  2. 提供建筑物相关信息的查询服务:

    • 提示用户输入要查询的建筑物名称。
    • 根据用户输入的建筑物名称,在校园地图中查找相应的建筑物信息。
    • 输出建筑物的相关信息,如名称、位置坐标等。
  3. 提供任意两个目标地的导航查询:

    • 提示用户输入起始建筑物和目标建筑物的名称。
    • 利用合适的算法(如最短路径算法,如Dijkstra算法)计算起始建筑物到目标建筑物的最短路径。
    • 输出最短路径上的建筑物信息,以指导参赛者从起始建筑物到目标建筑物的导航。
  4. 校验和错误处理:

    • 在查询过程中,校验用户输入的建筑物名称是否有效,如确保输入不为空或存在于校园地图数据中。
    • 处理可能出现的错误情况,如无效的起始建筑物或目标建筑物、无法到达目标建筑物等。
    • 提供适当的错误提示和处理机制,确保校园导游程序的正常运行。

3.概要设计 

1. 参赛队伍信息管理:

  • Team 类:表示参赛队伍的基本信息,包含参赛队编号、参赛作品名称、参赛学校、赛事类别、参赛者和指导老师等属性。这些属性需要提供相应的构造方法和访问器方法(getter和setter)。除此之外,还可以实现其他辅助方法和逻辑。
  • TeamManagementSystem 类:作为参赛队伍信息的管理系统,包括一个存储参赛队伍信息的集合。提供添加、删除和修改参赛队伍信息的方法,通过操作集合实现对参赛队伍的增删改。根据具体需求,可以考虑使用其他数据结构来存储参赛队伍信息。
public class Team {
    // 参赛队伍的基本信息属性
    private String teamNumber;
    private String projectName;
    private String school;
    private String category;
    private String participants;
    private String guideTeacher;
    
    // 构造方法和属性的访问器方法(getter和setter)

    // 其他辅助方法和逻辑
}

public class TeamManagementSystem {
    private List<Team> teams; // 存储参赛队伍信息的集合
    
    // 添加参赛队伍信息
    public void addTeam(Team team) {
        // 实现添加参赛队伍信息的逻辑
    }
    
    // 删除参赛队伍信息
    public void deleteTeam(String teamNumber) {
        // 实现删除参赛队伍信息的逻辑
    }
    
    // 修改参赛队伍信息
    public void modifyTeam(String teamNumber, Team updatedTeam) {
        // 实现修改参赛队伍信息的逻辑
    }
    
    // 根据参赛队编号查找参赛队伍信息
    public Team findTeamByNumber(String teamNumber) {
        // 实现基于二叉排序树的查找逻辑
        // 返回找到的参赛队伍信息
    }
}

2.参赛队伍查找:

  • Team 类:在问题一的基础上,添加一个静态方法 readTeamsFromFile,该方法接收一个文件名作为参数,实现从文件中读取参赛队伍信息的逻辑,并返回一个包含参赛队伍对象的集合。
  • TeamManagementSystem 类:在问题一的基础上,添加以下方法:
    • searchTeamByNumber:根据参赛队编号在参赛队伍集合中进行二叉排序树的查找操作。提示用户输入参赛队编号,若查找成功,则输出该参赛队伍的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),并计算平均查找长度(ASL)。若查找失败,则输出"查找失败!"。
    • 注意,二叉排序树的实现可以使用现有的数据结构库或手动实现。
public class Team {
    // 参赛队伍的基本信息属性
    // ...

    // 其他辅助方法和逻辑

    // 静态方法,从文件中读取参赛队伍信息
    public static List<Team> readTeamsFromFile(String fileName) {
        // 实现从文件中读取参赛队伍信息的逻辑
        // 返回包含参赛队伍对象的集合
    }
}

public class BinarySearchTree {
    // 二叉排序树的实现,包括节点定义和相关操作
    // ...
}

public class TeamManagementSystem {
    private BinarySearchTree teamSearchTree; // 存储参赛队伍信息的二叉排序树

    // 其他方法和逻辑

    // 从文件中读取参赛队伍信息并构建二叉排序树
    public void buildTeamSearchTree(String fileName) {
        List<Team> teams = Team.readTeamsFromFile(fileName);
        // 遍历参赛队伍集合,逐个插入到二叉排序树中
    }

    // 根据参赛队编号查找参赛队伍信息并输出
    public void searchTeamByNumber(String teamNumber) {
        Team team = teamSearchTree.search(teamNumber);
       

 3.参赛团队查询:

  • Team 类:在问题一的基础上,可以不做改动。
  • TeamManagementSystem 类:在问题一的基础上,添加以下方法:
    • searchTeamsBySchool:根据参赛学校名称进行查询,返回该学校参赛的所有团队的基本信息,并按赛事类别有序输出。可以使用选择排序、插入排序、希尔排序、归并排序、堆排序等排序算法中的任意一种,根据具体需求选择排序算法,并给出选择的原因。
    • searchTeamsByCategory:根据赛事类别进行查询,返回该类别下所有团队的基本信息,并按赛事类别有序输出。同样,根据具体需求选择排序算法,并给出选择的原因。
public class Team {
    // 参赛队伍的基本信息属性
    // ...

    // 其他辅助方法和逻辑

    // 静态方法,从文件中读取参赛队伍信息
    public static List<Team> readTeamsFromFile(String fileName) {
        // 实现从文件中读取参赛队伍信息的逻辑
        // 返回包含参赛队伍对象的集合
    }
}

public class TeamManagementSystem {
    private List<Team> teams; // 存储参赛队伍信息的集合

    // 其他方法和逻辑

    // 按参赛学校查询参赛团队
    public List<Team> searchTeamsBySchool(String school) {
        List<Team> result = new ArrayList<>();
        for (Team team : teams) {
            if (team.getSchool().equals(school)) {
                result.add(team);
            }
        }
        // 根据赛事类别进行排序
        // 返回按赛事类别有序的参赛团队列表
        return result;
    }

    // 按赛事类别查询参赛团队
    public List<Team> searchTeamsByCategory(String category) {
        List<Team> result = new ArrayList<>();
        for (Team team : teams) {
            if (team.getCategory().equals(category)) {
                result.add(team);
            }
        }
        // 根据赛事类别进行排序
        // 返回按赛事类别有序的参赛团队列表
        return result;
    }
}

4.决赛叫号系统:

  • Team 类:在问题一的基础上,可以不做改动。
  • FinalsCallSystem 类:实现决赛叫号系统的逻辑。包括一个队列(如Java中的 Queue)用于存储参赛队伍,以及以下方法:
    • addTeamToQueue:将参赛队伍添加到队列中。
    • callTeam:叫号并使参赛队伍进场。从队列中取出队首的参赛队伍,输出其信息,表示该队伍进场。若队列为空,则输出相应的提示信息。
public class Team {
    // 参赛队伍的基本信息属性
    // ...

    // 其他辅助方法和逻辑
}

public class FinalsCallSystem {
    private Queue<Team> callQueue; // 存储参赛队伍的队列

    // 其他方法和逻辑

    // 添加参赛队伍到队列
    public void addTeamToQueue(Team team) {
        // 实现添加参赛队伍到队列的逻辑
    }

    // 叫号并参赛队伍进场
    public void callTeam() {
        if (!callQueue.isEmpty()) {
            Team team = callQueue.poll(); // 取出队列中的参赛队伍
            // 输出当前叫号的参赛队伍信息
            // 参赛队伍进场
        } else {
            // 队列为空,无参赛队伍可叫号
        }
    }
}

 5.校园导游:

  • Building 类:表示建筑物的信息,包括名称、位置等属性。需要提供构造方法和属性的访问器方法。
  • CampusMap 类:存储建筑物信息的集合,可以使用一个列表(如Java中的 List)来存储建筑物对象。提供以下方法:
    • getBuildingByName:根据建楼名称获取建筑物对象。
    • getShortestPath:根据起始建筑物和目标建筑物之间的最短路径。这可以使用图算法(如Dijkstra算法)来实现,具体实现方式可以参考图的表示和最短路径算法的实现。返回一个包含最短路径上的建筑物对象的列表。

    • ContestGuideProgram 类:作为赛事导航程序的主要逻辑部分,包含一个 CampusMap 对象用于存储校园地图信息,并提供以下方法:

      • queryBuildingInformation:根据建筑物名称查询建筑物的相关信息。调用 CampusMap 对象的 getBuildingByName 方法来实现。
      • navigate:提供两个目标地之间最短路径的导航查询。调用 CampusMap 对象的 getShortestPath 方法来实现,并返回最短路径上的建筑物对象列表。
public class Building {
    private String name;
    private String location;
    // 其他建筑物属性

    // 构造方法和属性的访问器方法(getter和setter)
}

public class CampusMap {
    private List<Building> buildings; // 存储建筑物信息的集合
    // 其他属性和方法

    // 获取建筑物信息通过名称
    public Building getBuildingByName(String name) {
        for (Building building :
        buildings) {
            if (building.getName().equals(name)) {
                return building;
            }
        }
        return null; // 若找不到对应名称的建筑物,返回null
    }

    // 获取两个建筑物之间的最短路径
    public List<Building> getShortestPath(String startBuilding, String endBuilding) {
        // 实现获取两个建筑物之间最短路径的逻辑,可以使用图算法(如Dijkstra算法)

        // 返回最短路径上的建筑物列表
    }
}

public class ContestGuideProgram {
    private CampusMap campusMap; // 校园地图对象

    // 其他方法和逻辑

    // 提供建筑物相关信息的查询服务
    public Building queryBuildingInformation(String buildingName) {
        return campusMap.getBuildingByName(buildingName);
    }

    // 提供两个目标地之间最短路径的导航查询
    public List<Building> navigate(String startBuilding, String endBuilding) {
        return campusMap.getShortestPath(startBuilding, endBuilding);
    }
}

 下面给出校园景点的无向带权图: 

第(5)项内容以江苏科技大学长山校区为例,图例如下:

可制作如下示意图。

下面给出校园景点的无向带权图:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值