Невозможно выйти из цикла с исходным значением

#java

#java

Вопрос:

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

Может кто-нибудь указать, чего мне не хватает?

Код:

 import java.util.*;

public class LeapYear
{

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        boolean four ;
        boolean hundred;
        boolean four_hundred;
        boolean quit=true;
        int check= 2000;
        int min=1582;
        String test;

        //System.out.println("Enter a year to check if it  is a leap year");
        do {
            do {
                System.out.println("Enter a year to check if it  is a leap year");
                if(check <min ) {
                    System.out.println("That year is too old, choose a year in more recent history");
                }
                check =input.nextInt();
            } while( check < min);

            // check =input.nextInt();

            if(check % 4==0) {
                four=true;
            } else {
                four=false;
            }

            if(check%100==0) {
                hundred=true;
            } else {
                hundred=false;
            }

            if(check %400==0) {
                four_hundred=true;
            } else {
                four_hundred=false;
            }

            if(four==true) {

                if(four==trueamp;amp;hundred==falseamp;amp;four_hundred==false) {
                    System.out.println("The year is a leap year");
                }


                if(four==trueamp;amp;hundred==trueamp;amp;four_hundred==false) {
                    System.out.println("The year is not a leap year");
                }

                if(four==trueamp;amp;hundred==trueamp;amp;four_hundred==true) {
                    System.out.println("The year is a leap year");
                }
            } else {
                System.out.println("The year is not a leap year");
            }

            System.out.println("DO YOU WANT TO QUIT: Y/N ?");
            while(!input.hasNext("true|false")) {
                System.out.println("That is neither a true or false.");
                input.nextBoolean();

                if(input.hasNextBoolean()) {
                    quit=true;
                }

                if(input.hasNextBoolean()) {
                    quit=false;
                }
            }
        } while(!quit==false);
    }
}
  

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

1. Я бы посоветовал вам создать отдельный метод, который возвращает true / false для любого заданного ввода, чтобы проверить наличие високосного года. Это занимает всего около 5 или 6 строк кода. Также используется логические значения и == является избыточным. if (x == true) это просто if (x) , и x == false amp;amp; y ==true это !x amp;amp; y

2. Я считаю , что проблема существует повсюду input.nextBoolean(); . Вы никогда не фиксируете это значение и после этого дважды завершаете код, независимо от того, что было введено, если сканер имеет еще два логических значения

3. !quit == false ?? Есть ли причина для написания чего- либо подобного?

Ответ №1:

Вы могли бы сделать внешний цикл циклом while true. Затем, когда вы хотите выйти, вы просто возвращаетесь из метода, поэтому останавливаете метод и цикл. Нет необходимости в значении quit sentinel

Вы также запрашиваете Y / N, поэтому вы должны проверить это, а не true или false.

 String q = "n";
do {
  System.out.println("Do you want to quit: Y/N ?");
  String q = input.next();
  if (q.equalsIgnoreCase("y")) return; // quit right here 
  else if (!q.equalsIgnoreCase("n"))
  {
      System.out.println("That is neither a y or n.");
      continue; // repeat
  } else { } // entered y, so continue on with the outer loop 
} while (!q.equalsIgnoreCase("y") || !q.equalsIgnoreCase("n"));
  

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

 if(check %400==0) {
    four_hundred=true;
} else { 
    four_hundred=false;
}
  

Но вы действительно должны просто написать так

 four_hundred = check % 400; 
  

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

 if(four==true) {
    if(four==trueamp;amp;hundred==falseamp;amp;four_hundred==false) {
        System.out.println("The year is a leap year");
    }
    if(four==trueamp;amp;... 
  

Ответ №2:

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

 System.out.println("DO YOU WANT TO QUIT: Y/N ?");
while(!input.hasNext("true|false")) {
    System.out.println("That is neither a true or false.");
    input.nextBoolean();

    if(input.hasNextBoolean()) {
        quit=true;
    }

    if(input.hasNextBoolean()) {
        quit=false;
    }
}
  

При input.nextBoolean(); чтении входных данных возникают две проблемы:

  1. InputMismatchException если входные данные не могут быть отсканированы в true или false
  2. вы используете входные данные, но не помещаете их в переменную

Игнорируя первую проблему на данный момент, проблема заключается в том, что затем попробуйте установить quit на основе другой проверки ввода. Это означает, что input.hasNextBoolean() это может быть только true в том случае, если пользователь вводит true или false еще раз.

Помимо этого цикла while, существует также проблема с внешним самым do / while

     ...
} while(!quit==false);
  

Вы не quit тестируете и остаетесь в цикле, если это так false . Это означает, что когда quit == true вы остаетесь в курсе событий.

Вы , наверное , хотите писать while (!quit) .

Ответ №3:

Я бы посоветовал улучшить ваш код:

  1. Улучшите имена переменных.
  2. Удалите неиспользуемые переменные.
  3. Упростите выражения операторов if.

Вот код:

 import java.util.*;

public class LeapYear
{
    public static void main( String[] args ) {
        Scanner input = new Scanner(System.in);
        boolean isFour;
        boolean isQuit = true;
        int checkedYear = 2000;
        int minimumAcceptedYear = 1582;

        //System.out.println("Enter a year to check if it  is a leap year");
        do {
            do {
                System.out.println("Enter a year to check if it is a leap year");
                checkedYear = input.nextInt();
                if ( checkedYear < minimumAcceptedYear ) {
                    System.out.println("That year is too old, choose a year in more recent history");
                }
            } while ( checkedYear < minimumAcceptedYear );

            isFour = (checkedYear % 4) == 0;

            if ( isFour ) {
                System.out.println("The year is a leap year");
            } else {
                System.out.println("The year is not a leap year");
            }

            System.out.println("DO YOU WANT TO QUIT: (true/false) ?");

            if ( input.hasNextBoolean() ) {     
                isQuit = input.nextBoolean();
            } else {
                        System.out.println("That is neither a true or false.");
            }
        } while ( !isQuit );
    }
}
  

Это выглядит намного лучше. Я бы предложил извлечь

 isFour = (checkedYear % 4) == 0;

if ( isFour ) {
    System.out.println("The year is a leap year");
} else {
    System.out.println("The year is not a leap year");
}
  

к другому методу isLeapYear с параметром aYear . У вас ошибка несоответствия из-за того, что вы предоставляли неверные входные данные после проверки, если задан слишком старый год. Вы должны переместить условие if ниже checkedYear присваивания, чтобы избежать этих ошибок. Я надеюсь, что это полезный ответ.

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

1. isQuit = input.nextBoolean(); if ( isQuit ) isQuit = true; else isQuit = false; If / else не требуется, поскольку все, что он делает, это устанавливает isQuit то же значение, которое у него уже есть.