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. Я тестировал его несколько раз, но оказалось, что оно ниже среднего. Заранее спасибо!

2
Connor T 8 Мар 2015 в 06:42

6 ответов

Лучший ответ

Другие ответили, что проблема связана с индексацией в ваших циклах for, которая должна быть основана на 0, и это, безусловно, ошибка в вашем коде. Однако проблема не в этом.

В функциях getHighest() и getLowest() переменная scoreAverage относится к неинициализированной переменной уровня класса, объявленной непосредственно перед определением функций, а именно:

private static int scoreAverage;

А не к scoreAverage, объявленному в функции main(). Переменная уровня класса по умолчанию равна 0, и поэтому вы не видите значений меньше среднего.

Вы можете исправить свой код, удалив объявление scoreAverage в main() и изменив объявление уровня класса на:

 private static double scoreAverage;

Это должно быть double, а не int, так как деление возвращает тип с плавающей запятой, а не целое число.

В качестве альтернативы вы можете использовать переменную типа double, объявленную в main() для среднего результата, и передать его двум функциям вместо доступа к переменной уровня класса, и это, вероятно, предпочтительнее.

2
mhawke 8 Мар 2015 в 04:02

Как уже упоминали другие, ваши циклы 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
Blazo 8 Мар 2015 в 04:00

Вы не проверяете элемент в 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;
    }

}
1
shauryachats 8 Мар 2015 в 03:54

Индексирование вашего массива должно начинаться с 0, а не с 1 в методах getHighest(int[] score) и getLowest(int[] score). Таким образом, вы упускаете свои первые введенные значения.

1
JovanMali 8 Мар 2015 в 03:46
for (int index = 1; index < score.length; index++)

Массивы в Java (и большинстве языков программирования) используют нумерацию на основе 0. Ваши петли должны начинаться с int index = 0, а не с int index = 1.

2
mkobit 8 Мар 2015 в 03:47

Методы, которые вы вызываете: 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;
    }
0
Artyom 8 Мар 2015 в 04:05