Java требует дозорного значения из двух отдельных входов

Я только что наткнулся на итерацию, контролируемую дозорным, и у меня возникли некоторые трудности. Я должен сделать программу, которая получает пробег и использованные галлоны от пользователя, вычисляет общее количество миль на галлон. Я пытаюсь использовать -1 в качестве контрольного значения для выхода из цикла, когда пользователь закончит, но когда я перехожу к вводу значения, Java не завершает программу. Вместо этого он запрашивает другое значение в галлонах. Как мне заставить его принять дозорное значение из первого ввода?

Пример:

Введите мили или -1 для выхода

-1

Введите галлоны

-1

Прекратить

import java.util.Scanner;

public class Activity3_17 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        // processing phase
        int miles = 1;
        int gallons = 1;
        int totalMiles = 0;
        int totalGallons = 0;
        float mpg = 0;


        System.out.println("Enter miles or -1 to exit");
        miles = input.nextInt();

        System.out.println("Enter gallons");
        gallons = input.nextInt();

        while (miles != -1) {
            System.out.println("Enter miles or -1 to exit");
            miles = input.nextInt();

            System.out.println("Enter gallons or -1 to exit");
            gallons = input.nextInt();

            totalMiles = totalMiles + miles;
            totalGallons = totalGallons + gallons;


        }
        if (miles == -1) {
            System.out.print("Terminate");
        }
        else{
            mpg = (float) totalMiles / totalGallons;
            System.out.println(mpg);
            }

    }
}

person Harry Preston    schedule 19.10.2019    source источник
comment
Имейте в виду, что пользователь может ввести -1 в галлонах, но вы не проверяете значение этой переменной для этого условия выхода.   -  person Progman    schedule 20.10.2019


Ответы (4)


Вам нужно проверить, ввел ли пользователь -1 внутри цикла while. Если они это сделали, выйдите из цикла, используя break, а затем завершите программу.

mpg по-прежнему печатается внутри цикла, но только после того, как будет сделана проверка. Это гарантирует, что пользователь ввел правильный ввод.

Я решил сделать условие цикла true, так как цикл должен прерываться, если miles или gallons равно -1.

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

    int miles = 1;
    int gallons = 1;
    int totalMiles = 0;
    int totalGallons = 0;
    float mpg = 0;

    while (true) {
        System.out.println("Enter miles or -1 to exit");
        miles = input.nextInt();
        if (miles == -1) break;

        System.out.println("Enter gallons or -1 to exit");
        gallons = input.nextInt();
        if (gallons == -1) break;

        totalMiles = totalMiles + miles;
        totalGallons = totalGallons + gallons;
        mpg = (float) totalMiles / totalGallons;

        System.out.println(mpg);
    }
    input.close();
    System.out.print("Terminate");
}
person Anil M    schedule 19.10.2019

Java только оценивает цикл while каждый раз, когда он завершается. Поэтому вам нужно будет вручную проверить, было ли miles равным -1, и разорвать цикл.

while (miles != -1) {
    System.out.println("Enter miles or -1 to exit");
    miles = input.nextInt();

    if (miles == -1) break;         

    System.out.println("Enter gallons or -1 to exit");
    gallons = input.nextInt();

    totalMiles = totalMiles + miles;
    totalGallons = totalGallons + gallons;
}
person Rubydesic    schedule 19.10.2019

Просто добавьте 2 дополнительных условия в цикл while (если с перерывом), чтобы немедленно выйти из него.

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    // processing phase
    int miles = 1;
    int gallons = 1;
    int totalMiles = 0;
    int totalGallons = 0;
    float mpg = 0;


    System.out.println("Enter miles or -1 to exit");
    miles = input.nextInt();

    System.out.println("Enter gallons");
    gallons = input.nextInt();

    while (miles != -1) {
        System.out.println("Enter miles or -1 to exit");
        miles = input.nextInt();
        if(miles == -1) break;
        System.out.println("Enter gallons or -1 to exit");
        gallons = input.nextInt();
       if(gallons == -1) break;

        totalMiles = totalMiles + miles;
        totalGallons = totalGallons + gallons;


    }
    if (miles == -1) {
        System.out.print("Terminate");
    }
    else{
        mpg = (float) totalMiles / totalGallons;
        System.out.println(mpg);
        }

}
}

person Shevtsov    schedule 19.10.2019
comment
Только код это не ответ, объясните что вы делали и как он отвечает на проблему - person azro; 20.10.2019
comment
Я только что добавил 2 дополнительных условия в цикле while (если с перерывом), чтобы немедленно выйти из него. - person Shevtsov; 20.10.2019
comment
Не в комментарии, отредактируйте свой пост и дайте текст;) Вы никогда не найдете хороший принятый ответ только с кодом;) - person azro; 20.10.2019
comment
Извините, я новичок в stackoverflow) - person Shevtsov; 20.10.2019
comment
Не жалей, что я просто говорю тебе ;) просто учись со временем - person azro; 20.10.2019

Спасибо всем за помощь. Вот готовый и рабочий код:

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    int miles = 0;
    int gallons = 0;
    int totalMiles = 0;
    int totalGallon = 0;
    double mpg = 0;
    double totalMpg = 0;

    while(miles != -1){
        System.out.println("Enter mileage or -1 to exit: ");
        miles = input.nextInt();
        if(miles == -1){
            break;
        }
        System.out.println("Enter gallons or -1 to exit: ");
        gallons = input.nextInt();
        mpg = (double) miles / gallons;
        System.out.printf("MPG: %.4f%n", mpg);
        if(gallons == -1){
            break;
        }
        totalMiles = totalMiles + miles;
        totalGallon = totalGallon + gallons;

    }
    if (miles == -1){
        totalMpg = (double) totalMiles / totalGallon;
        System.out.printf("Total used is %.4f%n", totalMpg);
    }


}
person Harry Preston    schedule 19.10.2019