Почему программа не учитывает первый вход пользователя в расчет среднего значения? - PullRequest
0 голосов
/ 08 ноября 2018

Этот код предназначен для вывода среднего значения -1, если первое введенное пользователем значение равно -1.Если введенное значение не равно -1, то оно вычислит среднее из заданных значений и остановится, когда будет введено значение -1, и станет сигналом остановки программы.Задача состоит в том, чтобы изменить существующий цикл DoWhile - что я и сделал.

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

Scanner input = new Scanner(System.in);

float grade;
float sumGrades, average;
int studentCount = 0;
sumGrades = 0;

final int STOP = -1;

System.out.printf("\nEnter a grade (%d to finish): ", STOP);
grade = input.nextFloat();
if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}
else
    do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();

    if(grade != STOP)
      {
      sumGrades = sumGrades + grade;
      studentCount++;
      }
    } while(grade != STOP);

average = sumGrades / studentCount;
System.out.printf("The average obtained is %.1f\n", average);

ВЫХОД:

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): 3

Enter a grade (-1 to finish): 4

Enter a grade (-1 to finish): 5

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): 3

Enter a grade (-1 to finish): -1

The average obtained is 3.4

ВЫХОД 2:

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): -1

The average obtained is NaN

Изображение скомпилированного кода и прогона

Код

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Основной вопрос здесь:

   final int STOP = -1;


        System.out.printf("\nEnter a grade (%d to finish): ", STOP);
      grade = input.nextFloat(); 
if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}

здесь вы читаете ввод и просто проверяете, является ли он СТОП, но вы ничего не делаете с вводом, если не СТОП в следующем

else
    do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();

Вы снова читаете ввод, а затем обрабатываете его, если не ОСТАНОВИТЬ, и теряете свой первый ввод

решение за один цикл:

do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();
        if(grade != STOP)
          {
            sumGrades = sumGrades + grade;
            studentCount++;
          }

      } while(grade != STOP);
0 голосов
/ 08 ноября 2018

Внимательно посмотрите, что вы написали.

System.out.printf("\nEnter a grade (%d to finish): ", STOP);
grade = input.nextFloat();

Хорошо, пока

if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}

Итак ... если оценка означает "стоп" ... вы прибавляете ее к сумме и считаете?!?

else
    do
    {

Но если предыдущий класс НЕ был остановкой ... вы выбрасываете его и читаете следующий класс!?!

    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();

Видите проблему?

...