Почему я должен ввести два ввода для моего кода, чтобы начать работать? - PullRequest
0 голосов
/ 09 октября 2019

Я использую оператор while в своем коде, где внутри оператора while пользователь вводит число. Чтобы остановить цикл от программы, пользователь должен ввести слово «стоп». Однако, как только я ввожу число, вывод переходит на другую строку без печати оператора, который я хочу напечатать, и мне нужно снова ввести желаемый ввод, чтобы программа начала цикл. Единственный раз, когда эта проблема НЕ возникает, когда пользователь вводит «стоп» ПЕРВЫЙ, тогда код работает нормально.

Это чтобы найти максимальное, минимальное и среднее значение любого количества введенных пользователем чисел. Я попытался изменить порядок операторов else / if и параметров для указанных операторов else / if, но, похоже, ничего не работает.

    boolean stopped = false;

    int numberAmount = 0;
    int invalidAmount = 0;

    double max = Integer.MIN_VALUE;
    double min = Integer.MAX_VALUE;
    double mean = 0;        

    while(stopped == false)
    {   
        System.out.print("Enter a number (type "+"\""+"stop"+"\""+" to stop): ");
        String originalInput = userInput.nextLine();

        if(originalInput.equals("stop"))
        {
            stopped = true;
            invalidAmount ++;
            System.out.println(numberAmount+" numbers were entered with "+invalidAmount+" invalid inputs.");
        }

        else if(userInput.hasNextDouble())
        {
            double currentValue = Double.parseDouble(originalInput);
            max = Math.max(max, currentValue);
            min = Math.min(min, currentValue);
            mean = currentValue;
            numberAmount ++;
        }

        else if(originalInput.equals("stop") == false)
        {
            System.out.println("Not a number...");
            invalidAmount ++;
        }
    }


    System.out.println("The maximum is "+max+".");
    System.out.println("The minimum is "+min+".");
    System.out.println("The mean is "+(mean / numberAmount)+".");

    userInput.close();

}

}

Например, яожидайте, что результат ввода после 7 будет «Ввести число (введите« stop »для остановки):» на следующей строке (поскольку программа повторяет запрос на ввод числа), где пользователь может продолжать вводить числа по своему усмотрению,Вместо этого фактический вывод представляет собой пустую строку под исходным приглашением для пользовательского ввода, где пользователь должен ввести свой желаемый ввод СНОВА, чтобы программа начала цикл.

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Я думаю, что вы должны инвертировать логику кода, предполагая, что вы используете сканер, попробуйте что-то вроде этого:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        boolean stopped = false;

        int numberAmount = 0;
        int invalidAmount = 0;

        double max = Integer.MIN_VALUE;
        double min = Integer.MAX_VALUE;
        double mean = 0;

        while (stopped == false) {

            Scanner userInput = new Scanner(System.in);
            System.out.print("Enter a number (type " + "\"" + "stop" + "\"" + " to stop): ");

            if (userInput.hasNextDouble()) {
                double currentValue = userInput.nextDouble();
                max = Math.max(max, currentValue);
                min = Math.min(min, currentValue);
                mean = currentValue;
                numberAmount++;

            } else {
                String originalInput = userInput.nextLine();
                if (originalInput.equals("stop")) {
                    stopped = true;
                    invalidAmount++;
                    System.out.println(numberAmount + " numbers were entered with " + invalidAmount + " invalid inputs.");
                } else {
                    System.out.println("Not a number...");
                    invalidAmount++;
                }
            }
        }


        System.out.println("The maximum is " + max + ".");
        System.out.println("The minimum is " + min + ".");
        System.out.println("The mean is " + (mean / numberAmount) + ".");

        // userInput.close();
    }
}

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

1 голос
/ 09 октября 2019

Вы не указали в своем примере кода, что такое userInput, но при использовании он выглядит как экземпляр Scanner. Если вы объявили Scanner, а затем вызвали hasNextDouble(), вы получите логический результат, который соответствует вашему использованию - это условие указано в вашем if утверждении.

Scanner userInput = new Scanner(System.in);
boolean b = userInput.hasNextDouble();

Чтона картинке отсутствует hasNextDouble(). Рассматривая Javadoc для сканера :

Возвращает true, если следующий токен на входе этого сканера можно интерпретировать как двойное значение с помощью метода nextDouble (). Сканер не продвигается дальше какого-либо ввода.

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

Все это говорит о том, что ваш код выглядит так, как будто он работает нормально. Если вы не хотите ждать ввода пользователя, вам нужно написать свой код, отражающий это.

0 голосов
/ 09 октября 2019

Я действительно не знаю API, но я ожидаю, что hasNextDouble читает другую строку. Проверьте, является ли originalInput двойным, не читайте другую строку.

...