数据结构课程设计——赛事统计系统

目录

一、问题描述

1.基本要求

2.设计要求

二、问题分析

三、逻辑设计

1.采用的数据类型

2.主要模块

3.运行流程

四、物理设计

1.Main类

2.CompetitionManagementSystem类

3.Universities类

4.Teams类(extends Universities)

五、源代码

1.Main类

2.CompetitionManagementSystem类

3.Universities类

4.Teams类(extends Universities)


一、问题描述

参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。

1.基本要求

  1. 每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛并且每个队伍只能参加一个比赛项目
  2. 能统计各学校的总分
  3. 可以按照学校编号或名称,学校的总分、各项目的总分排序输出
  4. 可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校
  5. 数据存入文件并能随时查询

2.设计要求

  1. 输入数据形式和范围:可以输入学校的名称,赛事项目的名称
  2. 输出形式:有中文提示,各学校分数为整数
  3. 界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求
  4. 存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中

二、问题分析

本项目用于管理全国计算机设计大赛参赛队伍的相关信息,并能按用户需要输出竞赛成绩以及获奖情况,此外具有存储功能以便于随时查询已输入的队伍信息

三、逻辑设计

1.采用的数据类型

本项目主要采用数组存储每个学校的参赛信息,并利用Map将参赛项目与对应的参赛队伍联系起来,并声明Universities类以及Teams类,分别用于存放对应学校参赛信息和队伍信息

2.主要模块

  1. 信息输入:用来输入竞赛的相关信息,当输入信息有误时提示相关信息
  2. 数据的处理:主要操作为对竞赛成绩进行排序,如对每个学校的各项目总分排序、对指定项目的所有参赛队伍成绩排序、获得前三名的信息等
  3. 信息输出:根据用户需求输出指定数据,例如用户输入学校编号可得到对应获奖情况、根据所选项目输出前三名的信息
  4. 数据存储:每次完成输出后对当前数据进行保存,在下次打开项目时进行读取

3.运行流程

四、物理设计

1.Main类

控制程序的启动,以及完成存储和读取数据

信息的读取和存储采用I/O对象流来实现,具体过程如下:

  1. 当用户读取信息时会提示输入文件路径filePath,通过声明ObjectInputStream对象read来读取信息,将读取到的对象a向下转型为CompetitionManagementSystem类型的对象从而调用该类的方法来实现查询
  2. 当对信息进行存储时,提示用户输入存储路径,并将对象start存储至指定文件路径中,包含所有学校、队伍和竞赛信息

2.CompetitionManagementSystem类

实现程序的主体功能,包括对信息的管理和信息查询功能的实现

1.成员变量

int m参赛学校的总数
int n竞赛项目总数
Map<String, List<Teams> competition存放对应项目参赛队伍信息
String [] allName存放竞赛项目名称
Universities [] universities存放参赛学校的信息

2.方法

public void initialize()初始化参赛信息
public void function()选择系统功能
public void sort()对参赛成绩进行排名
public void queryUniversityIf()根据学校编号或名称查询学校信息
public void queryAwardIf()查询学校获奖情况
public void queryTopThree()查询竞赛项目前三名学校信息
public void printAllTeamsIf()打印参加对应竞赛项目所有队伍的信息

3.Universities类

存储学校相关信息,并管理对应学校的队伍信息

1.成员变量

int number学校编号
String universityName学校名称
int n参加竞赛的队伍数目
Teams [] teams存储参赛队伍信息

2.方法

public Universities()初始化对象
public int sumScore()返回学校总分
public int comScore()放回竞赛项目总分

4.Teams类(extends Universities)

存储队伍信息

1.成员变量

String teamName队伍名
String compititionName参赛的竞赛名称
int score竞赛成绩

五、源代码

1.Main类

import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        System.out.println("========计算机设计大赛赛事统计系统========");
        CompetitionManagementSystem start = new CompetitionManagementSystem();
        System.out.println("是否要读取数据?\ny:是\nn:否");
        char choose;
        while(true) {
            choose = in.next().charAt(0);
            if(choose!='y'&&choose!='n') System.out.println("输入有误,请重新输入");
            else break;
        }
        if (choose == 'y') {                              //读取信息
            System.out.println("请输入读取信息的文件路径");
            String filePath = in.next();
            ObjectInputStream read = new ObjectInputStream(new FileInputStream(filePath));
            Object a = read.readObject();
            CompetitionManagementSystem stored = (CompetitionManagementSystem) a;
            stored.function();
        } else {                                         //输入新的信息
            start.initialize();
            start.sort();
            start.function();
            System.out.println("是否对信息进行保存?\ny:是\nn:否");
            char judge = in.next().charAt(0);
            if (judge == 'y') {
                System.out.println("请输入文件存储路径");
                String filePath = in.next();
                ObjectOutputStream preserve = new ObjectOutputStream(new FileOutputStream(filePath));
                preserve.writeObject(start);
                preserve.close();
                System.out.println("数据保存完毕");
            }
        }
        System.out.println("系统运行完毕");

    }
}

2.CompetitionManagementSystem类

import java.io.Serializable;
import java.util.*;

class CompetitionManagementSystem implements Serializable {
    int m;                                  //参赛学校的总数
    int n;                                  //竞赛项目总数
    Map<String, List<Teams>> competition;   //存放竞赛项目参赛队伍信息
    String[] allName;                       //存放竞赛项目名称
    Universities[] universities;            //存放参赛学校信息

    public void initialize() {              //初始化参赛信息
        Scanner in = new Scanner(System.in);
        System.out.println("请输入参赛学校的总数");
        m = in.nextInt();
        universities = new Universities[m];
        System.out.println("请输入本赛事的项目总数");
        while(true) {
            n = in.nextInt();
            if(n>3&&n<=10)break;
            System.out.println("竞赛数目不符合标准,请重新输入");
        }
        System.out.println("======请输入各项目名称======");
        allName = new String[n];
        competition = new HashMap<>();
        for (int i = 0; i < n; i++) {
            String tempName = in.next();
            competition.put(tempName, new ArrayList<>());
            allName[i] = tempName;
        }
        System.out.println("======请输入学校的相关参赛信息======");
        for (int i = 0; i < m; i++) {                     //初始化学校及其队伍的信息
            System.out.println("请输入学校编号、学校名称");
            int number;
            String name;
            while (true) {
                number = in.nextInt();
                name = in.next();
                if (judgeUniversityNum(number)) break;
                System.out.println("已存在编号为" + number + "的学校,请检查是否输入有误");
            }
            System.out.println("请输入该校参加竞赛的队伍总数");
            int sum;
            while (true) {
                sum = in.nextInt();
                if (sum > 0 && sum <= 6) break;
                System.out.println("小队总数不符合竞赛规定,请重新输入");
            }
            Universities temp = new Universities(number, name, sum);
            System.out.println("======请输入该学校参赛队伍信息======");
            for (int j = 0; j < sum; j++) {
                Teams teams = new Teams();
                teams.universityName = name;
                teams.number = number;
                System.out.println("请输入小组名");
                teams.teamName = in.next();
                System.out.println("请输入小组编号");
                teams.teamNumber = in.nextInt();
                System.out.println("请输入该小组参加竞赛项目名");
                String comName;
                while (true) {
                    comName = in.next();
                    if (!competition.containsKey(comName))
                        System.out.println("输入有误,请重新输入");
                    else break;
                }
                teams.competitionName = comName;
                System.out.println("请输入该小组的竞赛得分");
                teams.score = in.nextInt();
                temp.teams[j] = teams;
                competition.get(comName).add(teams);
            }
            universities[i] = temp;
        }
        System.out.println("初始化工作已完成");
    }

    public boolean judgeUniversityNum(int number) {        //判断学校编号是否有误
        for (Universities i : universities) {
            if (i == null) break;
            if (i.number == number) return false;
        }
        return true;
    }

    public void function() {                  //功能
        Scanner in = new Scanner(System.in);
        System.out.println("======请输入需要进行的操作======");
        System.out.println("1:查询学校信息\n2:查询学校是否获奖");
        System.out.println("3:查询竞赛项目前三名信息\n4:打印竞赛项目名次信息");
        int option;
        while (true) {
            option = in.nextInt();
            if (option >= 1 && option <= 4) break;
            else System.out.println("输入有误,请重新选择");
        }
        switch (option) {
            case 1: {
                System.out.println("请输入学校编号或名称");
                String inf = in.next();
                queryUniversityIf(inf);
                break;
            }
            case 2: {
                System.out.println("请输入学校编号");
                int number = in.nextInt();
                queryAwardIf(number);
                break;
            }
            case 3: {
                System.out.println("请输入竞赛项目名称");
                String name = in.next();
                queryTopThree(name);
                break;
            }
            case 4: {
                System.out.println("请输入竞赛项目名称");
                String name = in.next();
                printAllTeamsIf(name);
            }
        }
        System.out.println("是否继续操作?\ny:继续\nn:结束");
        char c = in.next().charAt(0);
        if (c == 'y') function();
        else {
            System.out.println("查询结束");
            return;
        }
    }

    public void sort() {                               //对每个项目的队伍按成绩进行排序
        for (int i = 0; i < n; i++) {
            String name = allName[i];
            List<Teams> t = competition.get(name);
            t.sort(Comparator.comparing(Teams::getScore).reversed());
        }
    }

    public void queryUniversityIf(String inf) {           //查询学校的信息
        char judge = inf.charAt(0);
        Universities target = null;
        if (judge >= '0' && judge <= '9') {
            for (Universities i : universities)
                if (i.number == Integer.parseInt(inf)) target = i;
        } else for (Universities i : universities)
            if (i.universityName.equals(inf)) target = i;
        if (target == null) {
            System.out.println("未查询到学校的相关信息,请检查输入是否有误");
            return;
        }
        System.out.println("学校编号:" + target.number);
        System.out.println("学校名称:" + target.universityName);
        System.out.println("学校的总分:" + target.sumScore());
        System.out.println("排序后的各项目总分如下");
        Map<String, Integer> t = new HashMap<>();
        for (String i : allName) {
            int temp = target.comScore(i);
            if (temp != 0) t.put(i, temp);
        }
        while (t.size() != 0) {
            String max = null;
            int value = Integer.MIN_VALUE;
            Iterator<Map.Entry<String, Integer>> it = t.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, Integer> j = it.next();
                if (j.getValue() > value) {
                    max = j.getKey();
                    value = j.getValue();
                }
            }
            System.out.print("竞赛项目:");
            System.out.printf("%-8s", max);
            System.out.print("总分:");
            System.out.println(value);
            t.remove(max);
        }
    }

    public void queryAwardIf(int number) {                       //查询学校的获奖情况
        Universities target = null;
        boolean judge = true;                                     //判断该校是否获奖
        for (int i = 0; i < m; i++)
            if (universities[i].number == number)
                target = universities[i];
        if (target == null) {
            System.out.println("未查询到该校参赛信息,请核对查询信息是否有误");
            return;
        }
        Teams[] temp = target.teams;
        for (int i = 0; i < n; i++) {
            List<Teams> topThree;
            List<Teams> t = competition.get((allName[i]));
            if (t.size() <= 3) topThree = t;
            else topThree = t.subList(0, 3);
            if (t.size() > 3) {
                int index = 3;
                while (true) {
                    Teams p = t.get(index);
                    if (p.teamNumber != t.get(2).teamNumber) break;
                    else {
                        topThree.add(p);
                        index++;
                    }
                }
            }
            for (int j = 0; j < temp.length; j++) {
                if (topThree.contains(temp[j])) {
                    judge = false;
                    System.out.print(target.universityName + temp[j].teamName + "队");
                    System.out.println("获得" + allName[i] + "项目前三名");
                }
            }
        }
        if (judge) System.out.println("该学校未取得奖项");

    }

    public void queryTopThree(String name) {           //获得对应竞赛项目前三名学校信息
        if (!competition.containsKey(name)) {
            System.out.println("未查询到有关项目的相关信息,请检查输入是否有误");
            return;
        }
        List<Teams> t = competition.get(name);
        List<Teams> topThree;
        if (t.size() <= 3) topThree = t;
        else topThree = competition.get(name).subList(0, 3);
        if (t.size() > 3) {
            int index = 3;
            while (true) {
                Teams p = t.get(index);
                if (p.teamNumber != t.get(2).teamNumber) break;
                else {
                    topThree.add(p);
                    index++;
                }
            }
        }
        System.out.println(name + "项目前三名信息如下");
        System.out.println("名次     小队名      成绩     所属学校");
        for (int i = 0; i < topThree.size(); i++) {
            Teams team = topThree.get(i);
            System.out.print("第" + (i + 1) + "名    ");
            System.out.printf("%-10s", team.teamName);
            System.out.println(team.score + "      " + team.universityName);
        }

    }

    public void printAllTeamsIf(String name) {          //输出对应竞赛项目全部队伍的排名情况
        if (!competition.containsKey(name)) {
            System.out.println("未查询到有关项目的相关信息,请检查输入是否有误");
            return;
        }
        List<Teams> teams = competition.get(name);
        System.out.println(name + "项目成绩排名如下");
        System.out.println("名次     小队编号     小队名     成绩     所属学校");
        for (int i = 0; i < teams.size(); i++) {
            Teams team = teams.get(i);
            System.out.print("第" + (i + 1) + "名    ");
            System.out.printf("%-11s", team.teamNumber);
            System.out.printf("%-10s", team.teamName);
            System.out.println(team.score + "      " + team.universityName);
        }

    }
}

3.Universities类

import java.io.Serializable;

public class Universities implements Serializable {
    int number;                  //学校编号
    String universityName;       //学校名称
    int n;                       //该学校参赛队伍总数
    Teams[] teams;               //存放队伍信息

    public Universities(int number, String universityName, int n) {
        this.number = number;
        this.universityName = universityName;
        this.n = n;
        teams = new Teams[n];
    }

    public Universities() {
    }

    public int sumScore() {                //统计该学校总分
        int sum = 0;
        for (Teams i : teams) sum += i.score;
        return sum;
    }

    public int comScore(String name) {     //统计该学校对应竞赛项目的总分
        int sum = 0;
        for (Teams i : teams)
            if (i.competitionName.equals(name))
                sum += i.score;
        return sum;
    }
}

4.Teams类(extends Universities)

import java.io.Serializable;

public class Teams extends Universities implements Serializable {
    String teamName;              //队伍名
    int teamNumber;               //队伍编号
    String competitionName;       //参加的竞赛
    int score;                    //参赛成绩

    public int getScore() {
        return score;
    }

}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值