目录
2.CompetitionManagementSystem类
4.Teams类(extends Universities)
2.CompetitionManagementSystem类
4.Teams类(extends Universities)
一、问题描述
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
1.基本要求
- 每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛并且每个队伍只能参加一个比赛项目
- 能统计各学校的总分
- 可以按照学校编号或名称,学校的总分、各项目的总分排序输出
- 可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校
- 数据存入文件并能随时查询
2.设计要求
- 输入数据形式和范围:可以输入学校的名称,赛事项目的名称
- 输出形式:有中文提示,各学校分数为整数
- 界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求
- 存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中
二、问题分析
本项目用于管理全国计算机设计大赛参赛队伍的相关信息,并能按用户需要输出竞赛成绩以及获奖情况,此外具有存储功能以便于随时查询已输入的队伍信息
三、逻辑设计
1.采用的数据类型
本项目主要采用数组存储每个学校的参赛信息,并利用Map将参赛项目与对应的参赛队伍联系起来,并声明Universities类以及Teams类,分别用于存放对应学校参赛信息和队伍信息
2.主要模块
- 信息输入:用来输入竞赛的相关信息,当输入信息有误时提示相关信息
- 数据的处理:主要操作为对竞赛成绩进行排序,如对每个学校的各项目总分排序、对指定项目的所有参赛队伍成绩排序、获得前三名的信息等
- 信息输出:根据用户需求输出指定数据,例如用户输入学校编号可得到对应获奖情况、根据所选项目输出前三名的信息
- 数据存储:每次完成输出后对当前数据进行保存,在下次打开项目时进行读取
3.运行流程
四、物理设计
1.Main类
控制程序的启动,以及完成存储和读取数据
信息的读取和存储采用I/O对象流来实现,具体过程如下:
- 当用户读取信息时会提示输入文件路径filePath,通过声明ObjectInputStream对象read来读取信息,将读取到的对象a向下转型为CompetitionManagementSystem类型的对象从而调用该类的方法来实现查询
- 当对信息进行存储时,提示用户输入存储路径,并将对象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;
}
}