Обнаружение конкретного пользовательского ввода без его предварительной обработки в цикле while

#java #loops #while-loop

#java #циклы #цикл while

Вопрос:

У меня есть эта программа, в которой пользователь вводит x количество оценок, затем программа делит сумму оценок на количество принятых входных данных. Он также должен находить введенные самые высокие и самые низкие оценки. Когда пользователь закончил, он / она вводит -1, чтобы завершить программу. Однако у меня возникли некоторые проблемы с этим.

  1. Программа добавляет -1 к среднему значению, что искажает все мои результаты.
  2. Я не могу понять, как вычислить минимальное значение в списке. Он всегда считает -1 как минимальное значение.

Вот код ниже:

 import java.util.Scanner;

public class Lab4_EnteringGrades
{
    public static void main (String a[]) 
    {    
         Scanner kb = new Scanner(System.in); 
  
         double average = 0;
         double gradesSum = 0;
         int grade = 0; 
         int numTests = 0;
         int maxValue = 0;
         int minValue = 0;
 
        
         while (grade != -1)
         {
             gradesSum  = grade; 
             numTests  = 1; 
             average = gradesSum / numTests;
        
             System.out.print("Enter a grade: ");
             grade = kb.nextInt();
              
             while ((grade < -1) || (grade > 100))
             {
                 System.out.println("Invalid grade.");
                 System.out.print("Enter a grade: ");
                 grade = kb.nextInt();
             }     
     
             if (grade > maxValue)
                 maxValue = grade;
         
             if (grade < maxValue)
                 minValue = grade;
          }
     
         System.out.printf("nTotal number of tests: %d", numTests);
         System.out.printf("nThe average is %.1f", average);
         System.out.printf("nThe max value is %d", maxValue);
         System.out.printf("nThe min value is %d", minValue);
    }
}

  
  
  

Комментарии:

1. сразу после grade = kb.nextInt(); проверки этого if (grade == -1) break — вам не нужно выполнять, оставаясь частью цикла, если пользователь ввел -1

Ответ №1:

Я внес несколько изменений —

  1. Инициализация minValue and maxValue в вашем исходном коде minValue была -1 и grade не могла быть меньше -1, следовательно, вы всегда видели minValue как -1. В общем, если вам нужны минимальные и максимальные значения, лучше инициализировать, как я сделал здесь.

  2. Перенесена логика вычисления grade average ПОСЛЕ ввода пользователем grade , чтобы не испортить average .

  3. Ваш исходный код был:

if (grade < MaxValue)

Я изменил это на быть if (grade < minValue) . Я считаю, что это была опечатка.

 import java.util.Scanner;

public class Lab4_EnteringGrades {
    public static void main (String a[])
    {
        Scanner kb = new Scanner(System.in);

        double average = 0;
        double gradesSum = 0;
        int grade = 0;
        int numTests = 0;
        int maxValue = Integer.MIN_VALUE;
        int minValue = Integer.MAX_VALUE;


        while (true)
        {

            System.out.print("Enter a grade: ");
            grade = kb.nextInt();

            while ((grade < -1) || (grade > 100))
            {
                System.out.println("Invalid grade.");
                System.out.print("Enter a grade: ");
                grade = kb.nextInt();
            }
            if (grade == -1) {
                break;
            }

            gradesSum  = grade;
            numTests  = 1;
            average = gradesSum / numTests;


            if (grade > maxValue)
                maxValue = grade;

            if (grade < minValue)
                minValue = grade;
        }

        System.out.printf("nTotal number of tests: %d", numTests);
        System.out.printf("nThe average is %.1f", average);
        System.out.printf("nThe max value is %d", maxValue);
        System.out.printf("nThe min value is %d", minValue);
    } }
  

Ответ №2:

Проблемы заключаются в том, что

  1. Вы делаете gradesSum = grade; это перед чтением первого класса, когда grade все еще 0 .
  2. Вы делаете if (grade < maxValue) это после ввода пользователя grade=-1; , поэтому всегда обнаруживаете, что -1 это меньше.
  3. Вы сравниваете оценку maxValue как для проверки max, так и для min
  4. Поскольку вы инициализируете minValue=0 , вы никогда не найдете меньшее значение (кроме -1), поэтому вы должны инициализировать его чем-то большим

Вы можете переместить весь код, который обрабатывает оценку, до тех пор, пока вы ее не прочитаете, а затем break , если пользователь вводит -1 :

 import java.util.Scanner;

public class Lab4_EnteringGrades
{
public static void main (String a[])
  {
  Scanner kb = new Scanner(System.in);

  double average = 0;
  double gradesSum = 0;
  int grade = 0;
  int numTests = 0;
  int maxValue = 0;
  int minValue = 101;

  while (true)
     {
     System.out.print("Enter a grade: ");
     grade = kb.nextInt();

     while ((grade < -1) || (grade > 100))
        {
        System.out.println("Invalid grade.");
        System.out.print("Enter a grade: ");
        grade = kb.nextInt();
        }

     // Stop if the user entered -1
     if (grade == -1) break;

     gradesSum  = grade;
     numTests  = 1;
     average = gradesSum / numTests;

     if (grade > maxValue)
        maxValue = grade;

     if (grade < minValue)
        minValue = grade;
     }

  System.out.printf("nTotal number of tests: %d", numTests);
  System.out.printf("nThe average is %.1f", average);
  System.out.printf("nThe max value is %d", maxValue);
  System.out.printf("nThe min value is %d", minValue);
  }
}
  

Хотя while(true) { if(..) break; } это немного неудобно. Вы можете улучшить код еще больше, создав отдельную функцию для чтения входных данных:

 import java.util.Scanner;

public class Lab4_EnteringGrades
{
  public static int readGrade(Scanner kb) {
    System.out.print("Enter a grade: ");
    int grade = kb.nextInt();

    while ((grade < -1) || (grade > 100))
    {
      System.out.println("Invalid grade.");
      System.out.print("Enter a grade: ");
      grade = kb.nextInt();
    }
    return grade;
  }

  public static void main (String a[])
  {
    Scanner kb = new Scanner(System.in);

    double average;
    double gradesSum = 0;
    int grade;
    int numTests = 0;
    int maxValue = Integer.MIN_VALUE;
    int minValue = Integer.MAX_VALUE;

    // Common idiom for reading a grade until it's -1
    while ((grade = readGrade(kb)) != -1) {
      gradesSum  = grade;
      numTests  = 1;

      if (grade > maxValue)
        maxValue = grade;

      if (grade < minValue)
        minValue = grade;
    }
    // Consider handling the case of numTests == 0
    average = gradesSum / numTests;

    System.out.printf("nTotal number of tests: %d", numTests);
    System.out.printf("nThe average is %.1f", average);
    System.out.printf("nThe max value is %d", maxValue);
    System.out.printf("nThe min value is %d", minValue);
  }
}
  

Комментарии:

1. Отличный ответ, но вам не хватает, что он должен установить начальное значение MinValue на значение больше 100