Java 制作一个代表平均测试分数的类

Java 制作一个代表平均测试分数的类,java,Java,制作一个代表平均测试分数的类。让全班学生不受限制地获取分数,并计算考试次数和平均数 我似乎无法找到一种方法来存储所有的测试分数,以及计算给定文件中的测试数量。目前,这段代码将只计算一个测试,并且只存储最后给出的数字 此文件由讲师提供,不能更改 public class TestScoresDemo { public static void main(String[] args) { TestScores t1 = new TestScores("Alice");

制作一个代表平均测试分数的类。让全班学生不受限制地获取分数,并计算考试次数和平均数

我似乎无法找到一种方法来存储所有的测试分数,以及计算给定文件中的测试数量。目前,这段代码将只计算一个测试,并且只存储最后给出的数字

此文件由讲师提供,不能更改

public class TestScoresDemo {

    public static void main(String[] args) {
        TestScores t1 = new TestScores("Alice");
        TestScores t2 = new TestScores("Bob");

        t1.addTestScore(50);
        t1.addTestScore(60);
        t1.addTestScore(54);
        t1.addTestScore(73);
        t1.addTestScore(88);
        t1.addTestScore(92);

        t2.addTestScore(87);
        t2.addTestScore(97);
        t2.addTestScore(37);
        t2.addTestScore(99);

        System.out.println("-- Alice --");
        System.out.println("Num tests taken: " + t1.getNumTestsTaken());
        System.out.println("Average: " + t1.getAverage());

        System.out.println("-- Bob --");
        System.out.println("Num tests taken: " + t2.getNumTestsTaken());
        System.out.println("Average: " + t2.getAverage());
    }
}
讲师给出的文件结束。 以下是我到目前为止的情况

import java.util.Scanner;

public class TestScores {
    private String Name;
    private double TotalScore;
    private int NumScores;
    private double Earned;

    public TestScores(String name) {
        Name = name;
    }

    public void addTestScore(double earned) {
        Earned = earned;
    }

    public int getNumTestsTaken() {

        NumScores = 0;
        while (Earned < 100.0) { 
            NumScores++;
        }
        return NumScores;
    }

    public double getAverage() {
        try (Scanner scanner = new Scanner(Name)) {
            double sum = 0.0;
            while (Earned <100.0) {
                sum += Earned;
                TotalScore = sum / NumScores;
                break;
            }
            return TotalScore;
        }
    }
}
import java.util.Scanner;
公开课考试成绩{
私有字符串名称;
个人双倍总分;
私人国际货币基金组织;
私人双挣;
公共测试分数(字符串名称){
名称=名称;
}
公共无效添加测试分数(双倍){
挣得=挣得;
}
public int getNumTestsTaken(){
numcores=0;
而(挣得<100.0){
numcores++;
}
返回numcores;
}
公共双平均值(){
尝试(扫描仪=新扫描仪(名称)){
双和=0.0;

while(owned您没有正确使用变量numcores或TotalScore。此外,您应该为变量使用Java命名约定,因此将名称中的第一个字母更改为小写字母,然后使用大写字母,也称为驼峰大小写。请尝试以下操作

public TestScores(String name) {
    this.name = name;
    numScores = 0;
    totalScore = 0.0;
}

public void addTestScore(double earned) {
    totalScore += earned; //add to the running total
    numScores++; //add to the count
}

public int getNumTestsTaken() {
    return numScores; //simply return the counter
}

public double getAverage() {
    return totalScore/numScores; //return the total scores added up divided by the count
}

解决此问题有两种方法,以上评论中讨论了这两种方法:

  • 使用列表/数组/集合存储每个值
  • 添加新元素时,将数字加总
  • 正如您的要求所述,
    TestScores
    类不能更改,那么它将第一种方法从可能的解决方案中排除1,这使得唯一可行的答案成为第二种方法

    但在写下答案之前,我会拯救@Turing85's

    关于整体代码设计的一点说明:变量名和字段名应始终以小写字母开头(
    private String Name;
    ->
    private String Name;

    因此,您的
    TestScores
    属性可能会变成:

    private String name;
    private double totalScore;
    private int numScores;
    private double earned;
    
    这将使您和我们大家更容易阅读您的程序。阅读并遵循

    现在让我们看看您的程序现在正在做什么:

    t1.addTestScore(50); //earned = 50
    t1.addTestScore(60); //earned = 60
    t1.addTestScore(54); //earned = 54
    
    你想要什么:

    t1.addTestScore(50); //earned = 50
    t1.addTestScore(60); //earned = 110
    t1.addTestScore(54); //earned = 164
    
    (将变量名更改为以小写字母开头后)您需要做的就是:

    现在,
    getNumTestsTaken
    方法可能会变成:

    public int getNumTestsTaken() {
        return numScores;
    }
    
    您的
    getAverage
    方法将变成这样:

    public double getAverage() {
        return earned / numScores; //We already know the total amount earned as it's stored in "earned" variable and the number of scores stored in "numScores" so, this becomes a simple operation
    }
    
    对于代码的其余部分,我认为还可以


    1我将此答案中的数组/集合保留下来,但将此答案作为社区wiki,以防有人想添加它和答案。不过,我已经在此处解释了不适合此选项的原因(根据OP的要求)。

    “我似乎无法找到存储所有测试分数的方法。”您需要某种数组、列表或其他集合。@csmckelvey在本例中,不是真的。他们可以在添加测试分数时保留一个运行的总和和分数。分数添加后,他们似乎不需要生成列表。欢迎使用堆栈溢出!如果您在课堂上学习的概念有困难,我建议你和其他学生和你的老师谈谈。你也应该更仔细地看看你的
    getAverage()
    method。选择一些分数值,手工计算平均值。然后检查你的方法是否计算出相同的结果。@FedericoklezCulloca这当然是一个解决方案。我不确定初学者是否比存储所有分数的列表更容易理解和编写。@FedericoklezCulloca我只想保持一个运行的total更难,因为它是另一个抽象层次。一些初学者可能会理解它,但我怀疑,对于大多数人来说,存储列表更接近于他们认为的手工操作。当然,学习
    list
    API会增加复杂性。因此,哪一个更难,可能是一个难题。是的,th谢谢你的帮助,我很感谢你的反馈。
    public double getAverage() {
        return earned / numScores; //We already know the total amount earned as it's stored in "earned" variable and the number of scores stored in "numScores" so, this becomes a simple operation
    }