#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();
чтении входных данных возникают две проблемы:
InputMismatchException
если входные данные не могут быть отсканированы вtrue
илиfalse
- вы используете входные данные, но не помещаете их в переменную
Игнорируя первую проблему на данный момент, проблема заключается в том, что затем попробуйте установить quit
на основе другой проверки ввода. Это означает, что input.hasNextBoolean()
это может быть только true
в том случае, если пользователь вводит true или false еще раз.
Помимо этого цикла while, существует также проблема с внешним самым do / while
...
} while(!quit==false);
Вы не quit
тестируете и остаетесь в цикле, если это так false
. Это означает, что когда quit == true
вы остаетесь в курсе событий.
Вы , наверное , хотите писать while (!quit)
.
Ответ №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
то же значение, которое у него уже есть.