文章目录
一.问题描述
参加计算机设计大赛的n个学校编号为1-n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
二.基本要求
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称查询,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
三.设计要求
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
四.问题分析
【问题假设】
1.假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
2.假设所有参赛队伍一同编号,不受学校项目的约束且队伍编号不能重复
3.假设每个项目设三个奖项:一等奖,二等奖,三等奖,每个奖项均只有一个队伍名额,且同项目的每个队伍的分数不能相同。
【功能分析】
1.能统计各个学校的总分
2.可以按照学校编号或名称查询学校的总分,各项目的总分排序输出
3.可以按学校编号查询学校某个项目的获奖情况
4.可以按项目编号查询取得前三名的学校
5.数据存入文件并能随时查询
五.逻辑设计
【模块划分】
1.界面设计
2.添加学校,项目,队伍
3.输出学校列表,项目列表,队伍列表
More:根据上述功能分析中的五个功能划分为五个具体功能实现模块。
【抽象数据结构ADT】
ADT 计算机设计大赛赛事统计
Data
学校列表schools<School>
项目列表items<Item>
队伍列表teams<Team>
Operation
界面设计
输入:无
功能:输出主菜单交互界面
输出:主菜单交互界面
添加学校/项目/队伍
输入:学校/项目/队伍信息
功能:将输入的信息存入相应的列表和文件中
输出:无
输出学校/项目/队伍列表
输入:无
功能:输出学校/项目/队伍列表
输出:学校/项目/队伍列表
统计每个学校的总分
输入:无
功能:计算每个学校的总分并存入学校对象的sumscore成员中
输出:无
通过学校编号查询学校总分,各项目总分降序输出
输入:学校编号
功能:查询该学校的总分,降序输出各项目总分
输出:学校总分和降序的各个项目的总分
通过学校编号/名称查询学校总分,各项目总分降序输出
输入:学校编号/名称
功能:查询该学校的总分,降序输出各项目总分
输出:学校总分和降序的各个项目的总分
按学校编号查询学校某个项目的获奖情况
输入:学校编号和项目编号
功能:查询该学学该项目的获奖情况
输出:该学校该项目的获奖情况
按项目编号查询取得前三名的学校
输入:项目编号
功能:查询该项目取得前三名的学校
输出:该项目取得前三名的学校名称
退出系统
输入:0
功能:退出系统
输出:退出系统,欢迎下次再来!
end ADT
六.物理设计
【存储结构】
School类
私有成员:学校编号,学校名称,队伍数量,所含队伍列表;
公有方法:构造方法,getter方法,setter方法,增加队伍方法…;
Team类
私有成员:队伍编号,队伍所属学校编号,队伍所选项目编号,队伍得分;
公有方法:构造方法,读方法getter,写方法setter…;
Item类
私有成员:项目编号,项目名称,所含队伍数量,所含队伍列表;
公有方法:构造方法,getter方法,增加队伍方法…;
其他存储结构
LinkedList schools = new LinkedList<>();//学校列表存储所有学校
LinkedList teams = new LinkedList<>();//队伍列表存放所有队伍
LinkedList items = new LinkedList<>();//项目列表存放所有项目
ArrayList schoolindex = new ArrayList<>();//存放学校编号
ArrayList itemindex = new ArrayList<>();//存放项目编号
ArrayList teamindex = new ArrayList<>();//存放队伍编号
【功能实现】(只列出部分功能)
1.增添学校
//增添学校
void addschool(){
try{
Scanner input = new Scanner(System.in);
out.print("请输入需要增添的学校个数:");
int n = input.nextInt();
out.print("\n请输入学校编号和学校名称(输入-1强制退出):");
int num = 1;
while(num++ <= n){
out.println("\n请输入第" + (num-1) + "个学校信息:");
int i = input.nextInt();
if(i == -1){
break;
}
if(schoolindex.contains(i)){
out.println("该学校编号已存在,请重新输入!");
num--;
continue;
}
String s = input.next();
if(s.equals("-1")){
break;
}
School school = new School(i,s);
schools.add(school);//将输入的学校对象添加到schools列表中
schoolindex.add(i);//将输入的学校对象编号添加到schoolindex列表中
try {
WriteFile("schoollist.txt",i + "、" +s);
out.println("已完成" + s + "的文件存储");
} catch (IOException e) {
e.printStackTrace();
}
}
}catch (java.util.InputMismatchException e){
out.println("输入数据的类型错误!");
}
}
2.增添项目
//增添项目
void additem(){
try{
Scanner input = new Scanner(System.in);
out.print("请输入需要增添的项目个数:(输入-1强制退出)");
int n = input.nextInt();
out.print("\n请输入项目编号和项目名称(一个项目一行):");
int num = 1;
while(num++ <= n){
out.println("\n请输入第" + (num-1) + "个项目信息:");
int i = input.nextInt();
if(i == -1)
break;
if(itemindex.contains(i)){
out.println("该项目编号已存在,请重新输入!");
num--;
continue;
}
String s = input.next();
if(s.equals("-1"))
break;
Item item = new Item(i,s);
items.add(item);//将输入的项目对象添加到items列表中
itemindex.add(i);//将输入的项目对象编号添加到itemindex列表中
try {
WriteFile("itemlist.txt",i + "、" +s);
out.println("已完成" + s + "项目的文件存储");
} catch (IOException e) {
e.printStackTrace();
}
}
}catch (java.util.InputMismatchException e){
out.println("输入数据的类型错误!");
}
}
3.增添队伍
//增添队伍
void addteam(){
try{
Scanner input = new Scanner(System.in);
out.print("请输入需要增添的队伍个数:");
int n = input.nextInt();
out.print("\n请输入队伍编号,队伍所属学校编号,队伍所属项目编号以及队伍得分(输入-1强制退出):");
int num = 1;
while(num++ <= n){
out.println("\n请输入第" + (num-1) + "个队伍信息:");
int i = input.nextInt();
if(i == -1)
break;
if(teamindex.contains(i)){
out.println("该队伍编号已存在,请重新输入!");
num--;
continue;
}
int j = input.nextInt();
if(j == -1)
break;
if(!schoolindex.contains(j)){
out.println("该学校编号不存在,请重新输入!");
num--;
continue;
}
int k = input.nextInt();
if(k == -1)
break;
if(!itemindex.contains(k)){
out.println("该项目编号不存在,请重新输入!");
num--;
continue;
}
int score = input.nextInt();
if(k == -1)
break;
if(score > 100 || score < 0){
out.println("输入的分数需在0-100之间,您输入的分数不合法,请重新输入!");
num--;
continue;
}
Team team = new Team(i,j,k,score);
teams.add(team);//将输入的队伍对象添加到teams列表中
teamindex.add(i);//将输入的队伍对象编号添加到teamindex列表中
try {
WriteFile("teamlist.txt","编号:"+team.getIndex() + " 隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + " 参加了" + ItemindexToItemname(team.getItemindex()) + " 得分为:" + team.getScore());;
out.println("已完成编号为" + i + "的队伍的文件存储");
} catch (IOException e) {
e.printStackTrace();
}
}
//增加队伍后需要重新初始化学校队伍和项目队伍
inititemteam();
initschoolteam();
}catch (java.util.InputMismatchException e){
out.println("输入数据的类型错误!");
}
}
//将队伍列表写入文件"teamlist.txt"
void wteamlist(){
try {
WriteFile("teamlist.txt",String.format("当前已有队伍%d个:",teams.size()));
for(Team team:teams)
WriteFile("teamlist.txt","编号:"+team.getIndex() + " 隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + " 参加了" + ItemindexToItemname(team.getItemindex()) + " 得分为:" + team.getScore());
} catch (IOException e) {
e.printStackTrace();
}
}
4.读取文件并输出学校列表
//读取文件并输出学校列表
void printSchoolList(){
if(schools.isEmpty())
out.println("当前学校列表为空!");
else{
System.out.println("\t ***********学校列表************ ");
System.out.println("------------------------------------------");
/*out.printf("当前已有学校%d所:\n",schools.size());
for(School school:schools)
out.println(school.getIndex() + "、" +school.getName() + "队伍数量:" + school.getNumber());*/
try {
ReadFile("schoollist.txt");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("------------------------------------------");
}
}
5.读取文件并输出项目列表
//读取文件并输出项目列表
void printItemList(){
if(items.isEmpty())
out.println("当前项目列表为空!");
else{
System.out.println("\t ***********项目列表************ ");
System.out.println("------------------------------------------");
/*out.printf("当前已有项目%d个:\n",items.size());
for(Item item:items)
out.println(item.getIndex() + "、" + item.getName() + "队伍数量:" + String.format("%3d",item.getNumber()));*/
try {
ReadFile("itemlist.txt");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("------------------------------------------");
}
}
6.读取文件并输出队伍列表
//读取文件并输出队伍列表
void printTeamList(){
if(teams.isEmpty())
out.println("当前队伍列表为空!");
else{
System.out.println("\t ***********队伍列表************ ");
System.out.println("------------------------------------------");
/*out.printf("当前已有队伍%d个:\n",teams.size());
for(Team team:teams)
out.println("编号:"+team.getIndex() + " 隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + " 参加了" + ItemindexToItemname(team.getItemindex()));*/
try {
ReadFile("teamlist.txt");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("------------------------------------------");
}
}
7.统计学校总分
//统计每个学校的总分
void computersumscore(){
for(int i:schoolindex){
int sum = 0;
for(Team x:teams){
if(x.getSchoolindex() == i){
sum += x.getScore();
}
}
for(School x:schools){
if(x.getIndex() == i){
x.setSumscore(sum);
break;
}
}
}
}
8.文件存取
//向dir文件中写入string
public void WriteFile(String dir,String string) throws IOException {
File file = new File(dir);
//如果文件不存在,创建文件
if (!file.exists())
file.createNewFile();
//创建BufferedWriter对象并向文件写入内容
BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
//向文件中写入内容
bw.write(string + "\n");//写入后自动换行
bw.flush();
bw.close();
}
//读取dir文件
public void ReadFile(String dir) throws IOException {
File file = new File(dir);
//如果文件不存在,创建文件
if (!file.exists())
file.createNewFile();
//创建BufferedReader读取文件内容
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
【函数算法框架】
七.测试数据
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。