Как получить среднее значение всех чисел из списка - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно получить среднюю оценку теста из числа представленных пользователем значений и продолжать получать бесконечность. Мне нужно знать средний балл теста. Это студенческий класс:

public class Student {
    private String name;
    private int numOfQuizzes;
    private double totalScore;
    private ArrayList<Integer> scores;

    public Student(String name){
        this.name = name;
        scores = new ArrayList<Integer>();
    }

    public String getName() {
        return name;

    } public void addQuiz(int score){
        scores.add(score);
    }

    public double getTotalScore() {
        for(int score : scores){
            totalScore += score;
        }
        return totalScore;
    }

    public double getAverageScore(){
        return totalScore/(double)numOfQuizzes;
    }
}

Вот что у меня есть для основного:

    ArrayList<String> scores = new ArrayList<String>();
    Scanner inp = new Scanner(System.in);

    // Request the name
    System.out.print("What is your name? ");
    String name = inp.nextLine();

    // Create the student object
    Student student = new Student(name);

    // Ask for the grades
    System.out.print("Please enter your scores (q to quit): ");
    String grade = inp.nextLine();

    while (!grade.equals("q")) {
        // Convert the grade to an integer and pass it 
       **student.addQuiz(Integer.parseInt(grade));**
        //this is where the error is
        // Request a new grade
        grade = inp.nextLine();
    }

    // Report the results
    System.out.println("Students Name: " + student.getName());
    System.out.println("Total Quiz Scores: " + student.getTotalScore());
    double average = student.getTotalScore()/scores.size();
    System.out.println("Average Quiz Score: " + student.getAverageScore());

Это вывод:

What is your name? b
Please enter your scores (q to quit): 95
95
95
q
Students Name: b
Total Quiz Scores: 285.0
Infinity
Average Quiz Score: Infinity

Как вы можете видеть, я получаю бесконечность даже при делении баллов на размер.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вам нужно внести несколько изменений в ваш код, как показано ниже:

Студенческий класс:

public class Student {
    private String name;
    private double totalScore;
    private ArrayList<Integer> scores;

    public Student(String name){
        this.name = name;
        scores = new ArrayList<Integer>();
    }

    public String getName() {
        return name;

    } public void addQuiz(int score){
        scores.add(score);
    }

    public double getTotalScore() {
        totalScore = 0;
        for(int score : scores){
            totalScore += score;
        }
        return totalScore;
    }

    public double getAverageScore(){
        return getTotalScore()/scores.size();
    }
}

Основной класс:

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);

        // Request the name
        System.out.print("What is your name?: ");
        String name = input.nextLine();

        // Create the student object
        Student student = new Student(name);

        // Ask for the grades
        System.out.print("Please enter your scores (q to quit): ");
        String grade = input.nextLine();

        while (!grade.equals("q")) {
            // Convert the grade to an integer and pass it 
           student.addQuiz(Integer.parseInt(grade));
            // Request a new grade
            grade = input.nextLine();
        }

        // Report the results
        System.out.println("Students Name: " + student.getName());
        System.out.println("Total Quiz Scores: " + student.getTotalScore());
        System.out.println("Average Quiz Score: " + student.getAverageScore());
    }

}

Попробуйте использовать этот код, он будет работать правильно и отображать среднюю оценку вместо Infinity.

Изменения выполнены:

  1. Удалено private int numOfQuizzes; из Ученический класс .
  2. Добавлено totalScore = 0; в getTotalScore() метод в Студенческий класс .
  3. Добавлено return getTotalScore()/scores.size(); в getAverageScore() метод в Студенческий класс . Здесь getTotalScore() с общим счетом возврата и scores.size() возвращает общее количество баллов. (3 в случае вашего примера)
  4. Удалено ArrayList<String> scores = new ArrayList<String>(); из Основной класс . Как это не нужно в основном классе.
  5. Удалено double average = student.getTotalScore()/scores.size();, так как student.getAverageScore() в следующей строке будет вычислять и возвращать среднее значение.
0 голосов
/ 08 мая 2018

Я думаю, вы запутались, держась за два списка.

Удалить список результатов в основном методе. Также удалите totalScore из класса Student; это то, что называется «вычисляемым полем»

Обновить метод

public double getTotalScore() {
   double totalScore = 0;
    for(int score : scores){
        totalScore += score;
    }
    return totalScore;
}

Тогда вам действительно потребуется такой цикл, чтобы более точно обрабатывать порядок проверки ввода

String grade;
do {
    grade = inp.nextLine();
    if (grade.equals("q")) break;
    // Convert the grade to an integer and pass it 
    student.addQuiz(Integer.parseInt(grade));
} while (true);

Затем удалите numOfQuizzes из класса Student.

В обычном методе это то место, где вы используете

return getTotalScore()/scores.size();

В настоящее время вы получаете бесконечность дважды, потому что

  1. Основные оценки метода никогда не добавляются к
  2. Вы никогда не увеличиваете this.numOfQuizzes в классе ученика
...