import java.util.Scanner;
public class AnalyzingScores
{
public static void main(String[] args)
{
int count = 0;
double scoreTotal = 0;
int index;
int tests;
double scoreAverage;
double highest;
double lowest;
//Creates a new Scanner.
Scanner keyboard = new Scanner(System.in);
//Asks the user to enter how many tests they have taken.
System.out.println("Enter the amount of tests you have taken: ");
tests = keyboard.nextInt();
//Creates an array.
int[] score = new int[tests];
//Creates a for loop that asks a user to enter their test scores.
for (index = 0; index < tests; index++)
{
System.out.println("Enter your test score: ");
score[index] = keyboard.nextInt();
scoreTotal += score[index];
}
scoreAverage = scoreTotal / score.length;
System.out.println("You entered " + tests + " scores.");
System.out.println("The test average is " + scoreAverage);
System.out.println("Number of scores above or equal to the average is " + getHighest(score));
System.out.println("Number of scores below the average is " + getLowest(score));
}
private static int scoreAverage;
public static int getHighest(int[] score)
{
int aboveAverage = 0;
for (int index = 1; index < score.length; index++)
{
if (score[index] >= scoreAverage)
{
aboveAverage++;
}
}
return aboveAverage;
}
public static int getLowest(int[] score)
{
int belowAverage = 0;
for (int index = 1; index < score.length; index++)
{
if (score[index] < scoreAverage)
{
belowAverage++;
}
}
return belowAverage;
}
}
Всем привет! Прямо сейчас у меня проблема с кодом, и я не могу понять, почему. Код должен отправлять обратно количество оценок, которые выше или равны среднему, и те, которые ниже среднего.
Однако иногда код не возвращает правильный номер. Например, если я ввожу 3 результата теста, которые составляют 100, 90 и 80, среднее значение будет 90. Оно должно показать, что 2 выше / равны 90 и 1, что ниже 90. Проблема в том, что он показывает, что 0 ниже 90. Я тестировал его несколько раз, но оказалось, что оно ниже среднего. Заранее спасибо!
6 ответов
Другие ответили, что проблема связана с индексацией в ваших циклах for, которая должна быть основана на 0, и это, безусловно, ошибка в вашем коде. Однако проблема не в этом.
В функциях getHighest()
и getLowest()
переменная scoreAverage
относится к неинициализированной переменной уровня класса, объявленной непосредственно перед определением функций, а именно:
private static int scoreAverage;
А не к scoreAverage
, объявленному в функции main()
. Переменная уровня класса по умолчанию равна 0, и поэтому вы не видите значений меньше среднего.
Вы можете исправить свой код, удалив объявление scoreAverage
в main()
и изменив объявление уровня класса на:
private static double scoreAverage;
Это должно быть double, а не int, так как деление возвращает тип с плавающей запятой, а не целое число.
В качестве альтернативы вы можете использовать переменную типа double, объявленную в main()
для среднего результата, и передать его двум функциям вместо доступа к переменной уровня класса, и это, вероятно, предпочтительнее.
Как уже упоминали другие, ваши циклы for должны начинаться с индекса 0:
for (int index = 0; index < scrore.length; index++)
Но есть еще одна проблема с вашим кодом: вы объявляете две переменные с именем scoreAverage: одна в основном методе:
double scoreAverage;
а в другой раз чуть ниже основного метода в виде статического поля:
private static int scoreAverage
;
Итак, вам нужно сделать только одно изменение:
private static double scoreAverage;
public static void main(String[] args)
{
int count = 0;
double scoreTotal = 0;
int index;
int tests;
//double scoreAverage; <--- remove that
double highest;
double lowest; ...
И ваш код должен работать.
Вы не проверяете элемент в 0
-м индексе в ваших getHeighest()
и getLowest()
. Следовательно, вы получаете на один меньше ожидаемого значения в aboveAverage
или belowAverage
.
Удалить строку
private static int scoreAverage;
И передайте scoreAverage
обеим функциям.
Код:
public static int getHighest(int[] score, double scoreAverage)
{
int aboveAverage = 0;
//Index should start from 0 to avoid skipping the first element of the array.
for (int index = 0; index < score.length; index++)
{
if (score[index] >= scoreAverage)
{
aboveAverage++;
}
}
return aboveAverage;
}
public static int getLowest(int[] score, double scoreAverage)
{
int belowAverage = 0;
//Here also, index should start from 0.
for (int index = 0; index < score.length; index++)
{
if (score[index] < scoreAverage)
{
belowAverage++;
}
}
return belowAverage;
}
}
Индексирование вашего массива должно начинаться с 0, а не с 1 в методах getHighest(int[] score)
и getLowest(int[] score)
. Таким образом, вы упускаете свои первые введенные значения.
for (int index = 1; index < score.length; index++)
Массивы в Java (и большинстве языков программирования) используют нумерацию на основе 0. Ваши петли должны начинаться с int index = 0
, а не с int index = 1
.
Методы, которые вы вызываете: getHighest () и getLowest () не имеют правильной переменной scoreAverage. В коде этих методов переменная scoreAverage равна 0. Итак, вы можете сделать это:
public static int getHighest(int[] score, double scoreAverage)
{
int aboveAverage = 0;
for (int index = 0; index < score.length; index++)
{
if (score[index] >= scoreAverage)
{
aboveAverage++;
}
}
return aboveAverage;
}
public static int getLowest(int[] score, double scoreAverage)
{
int belowAverage = 0;
for (int index = 0; index < score.length; index++)
{
if (score[index] < scoreAverage)
{
belowAverage++;
}
}
return belowAverage;
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.