一、问题描述及其要求
【问题描述】
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
二、问题分析和任务定义
【问题分析】
由于题目没有给相关数据,所以可使用随机数生成学校数量,项目数量以及每个学校参赛队伍数量,也可以手动输入,但名称需要手动输入,也需要注意相关限制条件。3<赛事项目数量<=10,学校名称长度不超过20个字符。以及每个学校的每个参赛队伍智能参加一个项目。又由题目限制条件可以知道参赛的学校一定大于等于10个。所以如果用随机数生成学校数目要加参数。
【任务定义】
任务一:统计各个学校的总分。
任务二:可以根据学校编号或名称获取相关学校总分和项目分数以及获奖情况。
任务三:可以根据项目编号获取该项目得分在前三的学校名称。
任务四:将这次比赛的数据存入文件方便随时查询。
三、逻辑设计
【相关类的创建】
Project类
class Project {
int projectNumber;//项目编号
String projectName;//项目名称
public int getProjectNumber() {
return projectNumber;
}
public void setProjectNumber(int projectNumber) {
this.projectNumber = projectNumber;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
}
Team类
class Project {
int projectNumber;//项目编号
String projectName;//项目名称
public int getProjectNumber() {
return projectNumber;
}
public void setProjectNumber(int projectNumber) {
this.projectNumber = projectNumber;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
}
School类
class Project {
int projectNumber;//项目编号
String projectName;//项目名称
public int getProjectNumber() {
return projectNumber;
}
public void setProjectNumber(int projectNumber) {
this.projectNumber = projectNumber;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
}
【主函数所需要的方法及其参数】
void initialize() | 用于对学校,队伍,项目等相关数据进行初始化。 |
Map allSchoolScores() | 用于统计各个学校的总分,按照学校编号进行排序并返回总分和学校编号。 |
String[] topThreeSchool(int project) | 获得该项目分数在前三名的学校名称。以项目编号为参数 |
int schoolScore(String school) | 可以根据学校编号或名称获取相关学校总分。 |
Map schoolProjectsScore(String school) | 可以根据学校编号或名称获取相关学校项目分数。 |
int schoolPrize(String school) | 可以根据学校编号或名称获取相关学校获奖情况。 |
int[] schoolDetail(String school) | 可以根据学校编号或名称获取相关学校总分和项目分数以及获奖情况。 |
void allDetail() | 将所有数据存入文件 |
四、物理设计
public static int n;//学校数量
public static int m;//项目数量
public static School[] schools= new School[n];//储存学校的数组
public static Random random = new Random();//生成随机数
void initialize():对相关数据进行初始化。
Map allSchoolScores():将所有学校的编号与总分以key-value的形式返回,用hashMap储存。
String[] topThreeSchool(int project): 根据项目编号从Schools 中每一个学校参加了该项目的队伍中得到前三的队伍,再返回各自学校的名称。
int schoolScore(String school) : 根据学校名称在schools中找到该学校并返回其总分。
Map schoolProjectScore(String school): 在schools中找到学校,从teams中获得项目编号和项目分数,并以key-value的map形式返回。
int schoolPrize(String school): 从schools中找到学校,再从teams中找到在自己项目中获得前三的队伍个数,返回即为获奖数量。
void allDetail(): 将所有数据转换为文件。
main(): 设计交互界面,并根据要求调用方法。