2015-03-08 3 views
2
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. Я тестировал его несколько раз, и, похоже, это происходит только ниже среднего. Заранее спасибо!

+0

Я думаю, что это потому, что вы начинаете с 'индексом = 1' начинаются с' индексом = 0' – TheUknown

ответ

2

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

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

private static int scoreAverage; 

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

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

private static double scoreAverage; 

Она должна быть двойным, а не INT, так как деление возвращает тип с плавающей точкой , а не целое число.

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

+0

Большое спасибо! Исправлено это для меня. – Connor

1

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

+0

Я бы upvote этого ответа , но ему не хватает кода, чтобы помочь ему. – camdixon

1

Вы не проверки элемента в 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

Спасибо, и всем, кто помог, но код теперь показывает, что есть 3 выше/равно среднему. – Connor

+0

Большое спасибо! – Connor

2
for (int index = 1; index < score.length; index++) 

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

0

Как уже упоминалось, ваш для-петли должны начинаться с индекса 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

Методы, которые вы вызываете: getHighest() и getLowest() не имеют правильной переменной переменной. В коде что методы переменная 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; 
    } 
Смежные вопросы