面向对象程序设计 课后作业1

任务说明:编写一个评委评分命令行程序,用于某舞蹈大赛选手评分。该程序需具备如下功能:
(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));
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值