Как получить среднее значение всех чисел из списка

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

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

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

Что за "ошибка времени выполнения"?

Hovercraft Full Of Eels 08.05.2018 02:44

Этот while (!grade.equals('q')) { никогда не должен быть правдой

Hovercraft Full Of Eels 08.05.2018 02:44

нужно ли было только "д"? ржу не могу

b w 08.05.2018 02:46

Понятия не имею - опять же, в чем ваша ошибка ??

Hovercraft Full Of Eels 08.05.2018 02:46

ну, я добавил вместо этого «q», и это устранило ошибку времени выполнения. но теперь вывод: Имя ученика: Том Общее количество баллов в тесте: 258,0 Среднее количество баллов в тесте: бесконечность (это должно быть среднее значение)

b w 08.05.2018 02:48

или входная строка: «q» в java.lang.NumberFormatException.forInputString (Неизвестный источник) в java.lang.Integer.parseInt (Неизвестный источник) в java.lang.Integer.parseInt (Неизвестный источник) в finalReview.FinalReview.main ( FinalReview.java:73)

b w 08.05.2018 02:49

numOfQuizes равно и остается 0, поэтому вы всегда делите на 0 при вычислении среднего.

Hovercraft Full Of Eels 08.05.2018 02:49

Итак, как я могу отслеживать количество входов, чтобы получить среднее значение?

b w 08.05.2018 02:52

Вот и задумчивый вопрос: зачем вам вообще numOfQuizzes? Вы добавляете в список ... У списка есть метод размера

OneCricketeer 08.05.2018 02:54

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

OneCricketeer 08.05.2018 02:55

@ cricket_007 это имеет смысл, но я пытаюсь найти среднюю оценку. Это означает, что мне нужно разделить балл на общий балл.

b w 08.05.2018 02:59

А ты можешь. Используя существующий метод общей оценки. Делится по длине списка. ИЛИ ЖЕ Спросите себя: почему вы не увеличиваете количество баллов при добавлении единицы?

OneCricketeer 08.05.2018 03:01

На этом этапе вам следует отредактировать его, чтобы решить проблему, которую вы пытаетесь решить в комментариях. В сообщении все еще говорится об ошибке времени выполнения, которую вы, кажется, решили.

ChiefTwoPencils 08.05.2018 03:04

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

b w 08.05.2018 03:09

@ cricket_007 Я его изменил.

b w 08.05.2018 03:14

Что изменилось? Я все еще вижу, что у вас numOfQuizzes не добавляется ни в метод размера списка

OneCricketeer 08.05.2018 03:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
16
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Удалите список оценок в основном методе. Также удалите 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 в классе Student

куда вы добавляете do {grade = inp.nextLine () ;?

b w 08.05.2018 03:37

Вместо текущего цикла while. Это называется делом

OneCricketeer 08.05.2018 03:38

Я удалил numofquizzes из моего файла класса, но я все еще получаю бесконечность, используя этот

b w 08.05.2018 03:43

Я предлагаю вам распечатать числа по мере их добавления и пройтись по вашему коду с помощью отладчика. ericlippert.com/2014/03/05/how-to-debug-small-programs

OneCricketeer 08.05.2018 03:45

Я не уверен, что вы изменили, исходя из того, что я сказал. Я сейчас не запускаю этот код, чтобы проверить его сам

OneCricketeer 08.05.2018 03:47
Ответ принят как подходящий

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

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

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() в следующей строке будет вычислять и возвращать среднее значение.

Другие вопросы по теме