任务说明:编写一个评委评分命令行程序,用于某舞蹈大赛选手评分。该程序需具备如下功能:
(1)用户能设定评委人数和选手人数;
(2)某选手完成表演后,能输入该选手的姓名,每个评委(评委用数字编号表示,0表示评委1,其他类推)的评分(区间[0,10]上);
(3)选手最终得分计算规则:去掉1个最高分和1个最低分,求其余的平均分(保留小数点后两位有效数字)。
(4)比赛完毕,程序不会自动退出,除非用户选择退出;
(5)比赛完毕后,只要程序没有退出,用户能随时选择升序或降序输出选手得分信息,包括“排名、选手顺序号、选手姓名、评分1、评分2、…评分N、最终得分”。
任务要求:
(1)界面友好,用户输入错误,能给出明确提示,并允许重新输入;
(2)程序代码可读性好,所有方法都要给出规范的注释;
(3)程序结构合理,代码重用性、灵活性、可扩展性较强。
(4)教师抽查学生作业,学生应能够在脱离IDE环境下演示程序,并能够正确回答教师的随机问题。回答显示学生完全不懂这个程序如何编写,则无论是否运行正确,都视为不及格。
(5)作业内容为你的程序源码截图(每一个类对应一个截图)和运行结果画面完整截图,测试用例不少于3组。运行画面的最后一行必须输出你的学号和姓名。
(6)你的项目压缩为一个压缩文件,作为附件上传。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class ScoreCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入评委人数:");
int judgeCount = scanner.nextInt();
System.out.println("请输入选手人数:");
int playerCount = scanner.nextInt();
ArrayList<Player> players = new ArrayList<>();
for (int i = 0; i < playerCount; i++) {
System.out.println("请输入选手姓名:");
String name = scanner.next();
System.out.println("请输入选手得分:在区间[0,10]上");
ArrayList<Double> scores = new ArrayList<>();
while(true){
for (int j = 0; j < judgeCount; j++) {
System.out.print("评委"+j+":");
double score = scanner.nextDouble();
scores.add(score);
}
boolean open = true;
for (int j = 1; j <= judgeCount; j++) {
double score = scores.get(j-1);
if(score<0||score>10){System.out.println("第"+j+"位裁判输入错误,请各位裁判重新输入");
open = false;
}
}
if (open == true) {
break;
}
scores.clear();
}
Player player = new Player(name, scores);
players.add(player);
}
while (true) {
System.out.println("请输入命令:exit表示退出、ascend表示排名升序、descend表示排名降序");
String command = scanner.next();
if (command.equals("exit")) {
System.out.print("2100301413蒋熹煜");
break;
} else if (command.equals("ascend")) {
Collections.sort(players, new ScoreComparator());
printPlayers(players);
} else if (command.equals("descend")) {
Collections.sort(players, Collections.reverseOrder(new ScoreComparator()));
printPlayers(players);
}else {
System.out.println("输入格式不正确请重新输入");
}
}
scanner.close();
}
private static void printPlayers(ArrayList<Player> players) {
System.out.println("排名\t选手顺序号\t选手姓名\t评分1\t评分2\t...\t评分N\t最终得分");
for (int i = 0; i < players.size(); i++) {
Player player = players.get(i);
System.out.println((i+1) + "\t" + player.order + "\t\t" + player.name + "\t" + player.scoresToString() + "\t" + String.format("%.2f", player.getFinalScore()));
}
}
private static class Player {
public String name;
public ArrayList<Double> scores;
public int order;
public Player(String name, ArrayList<Double> scores) {
this.name = name;
this.scores = scores;
this.order = 1;
}
public double getFinalScore() {
int scoreCount = scores.size();
if (scoreCount <= 2) {
return 0;
}
double minScore = scores.get(0);
double maxScore = scores.get(0);
double totalScore = 0;
for (int i = 0; i < scoreCount; i++) {
double score = scores.get(i);
if (score < minScore) {
minScore = score;
}
if (score > maxScore) {
maxScore = score;
}
totalScore += score;
}
return (totalScore - minScore - maxScore) / (scoreCount - 2);
}
public String scoresToString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < scores.size(); i++) {
if (i > 0) {
sb.append("\t");
}
sb.append(scores.get(i));
}
return sb.toString();
}
}
private static class ScoreComparator implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
return Double.compare(p2.scores.get(0), p1.scores.get(0));
}
}
}