Мне нужно получить средний балл за тест по числам, отправленным пользователем, и продолжать получать бесконечность. Мне нужно знать средний балл за тест. Это студенческий класс:
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
Как видите, я получаю бесконечность даже при делении оценок на размер.
Этот while (!grade.equals('q')) { никогда не должен быть правдой
нужно ли было только "д"? ржу не могу
Понятия не имею - опять же, в чем ваша ошибка ??
ну, я добавил вместо этого «q», и это устранило ошибку времени выполнения. но теперь вывод: Имя ученика: Том Общее количество баллов в тесте: 258,0 Среднее количество баллов в тесте: бесконечность (это должно быть среднее значение)
или входная строка: «q» в java.lang.NumberFormatException.forInputString (Неизвестный источник) в java.lang.Integer.parseInt (Неизвестный источник) в java.lang.Integer.parseInt (Неизвестный источник) в finalReview.FinalReview.main ( FinalReview.java:73)
numOfQuizes равно и остается 0, поэтому вы всегда делите на 0 при вычислении среднего.
Итак, как я могу отслеживать количество входов, чтобы получить среднее значение?
Вот и задумчивый вопрос: зачем вам вообще numOfQuizzes? Вы добавляете в список ... У списка есть метод размера
Вы должны дополнительно проверить, равна ли указанная длина нулю, прежде чем пытаться разделить. Например, вы сразу же ввели q, не должно вызывать ошибки.
@ cricket_007 это имеет смысл, но я пытаюсь найти среднюю оценку. Это означает, что мне нужно разделить балл на общий балл.
А ты можешь. Используя существующий метод общей оценки. Делится по длине списка. ИЛИ ЖЕ Спросите себя: почему вы не увеличиваете количество баллов при добавлении единицы?
На этом этапе вам следует отредактировать его, чтобы решить проблему, которую вы пытаетесь решить в комментариях. В сообщении все еще говорится об ошибке времени выполнения, которую вы, кажется, решили.
Когда я использую общий счет / размер, я все равно получаю бесконечность. и я не знаю почему.
@ cricket_007 Я его изменил.
Что изменилось? Я все еще вижу, что у вас numOfQuizzes не добавляется ни в метод размера списка




Думаю, вы запутались, держась за два списка.
Удалите список оценок в основном методе. Также удалите 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();
В настоящее время вы получаете Бесконечность дважды, потому что
this.numOfQuizzes в классе Studentкуда вы добавляете do {grade = inp.nextLine () ;?
Вместо текущего цикла while. Это называется делом
Я удалил numofquizzes из моего файла класса, но я все еще получаю бесконечность, используя этот
Я предлагаю вам распечатать числа по мере их добавления и пройтись по вашему коду с помощью отладчика. ericlippert.com/2014/03/05/how-to-debug-small-programs
Я не уверен, что вы изменили, исходя из того, что я сказал. Я сейчас не запускаю этот код, чтобы проверить его сам
Вам нужно внести несколько изменений в свой код, как показано ниже:
Студенческий класс:
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.
Изменения внесены:
private int numOfQuizzes; из Студенческий класс.totalScore = 0; в метод getTotalScore() в Студенческий класс.return getTotalScore()/scores.size(); в метод getAverageScore() в Студенческий класс. Здесь getTotalScore() с общим количеством баллов, а scores.size() - с общим количеством баллов. (3 в случае вашего примера)ArrayList<String> scores = new ArrayList<String>(); из Основной класс. Поскольку это не нужно в основном классе.double average = student.getTotalScore()/scores.size();, потому что student.getAverageScore() в следующей строке будет вычислять и возвращать среднее значение.
Что за "ошибка времени выполнения"?