我正在尝试为我的高中班级编写一个代码,在其中输入年份并让程序确定是否是a年。我的大部分代码都写下来了,但是我在正确设置方面遇到了麻烦。除非它是我们正在使用的标志(我使用-1作为标志),否则我们不应该能够在1582年之前输入。输入有效年份(例如先输入2000然后再输入1581)之后,只要在1582年以下输入年份,程序便会结束,并且我不知道如何进行更改。我的代码如下:
import java.util.Scanner;
public class Lab3_3 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int year;
Scanner scan = new Scanner(System.in);
System.out.println("Enter a year after 1582(Type -1 to stop): ");
year = scan.nextInt();
while (year < 1582 && year != -1) {
System.out.println("ERROR! YEAR MUST BE AFTER 1582!");
System.out.println("Enter a new year(Type -1 to stop): ");
year = scan.nextInt();
}
if (year == -1)
System.out.println("You're done!");
else
while (year != -1) {
if (year >= 1582) {
boolean leap = false;
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
leap = true;
else
leap = false;
} else
leap = true;
} else
leap = false;
if (leap) {
System.out.println(year + " is a leap year.");
System.out.println("Enter a new year(Type -1 to stop): ");
year = scan.nextInt();
} else {
System.out.println(year + " is not a leap year.");
System.out.println("Enter a new year(Type -1 to stop): ");
year = scan.nextInt();
}
}
}
}
}
答案 0 :(得分:1)
仅修正您的代码,而不是尝试提出解决此问题的最佳方法,因为在线有100万个示例。
问题出在这部分:-
while (year != -1) {
if (year >= 1582) {
...
}
}
如果输入的年份小于1582,则它将进入无限的while循环,因为您没有办法再次获取输入。它会一直检查最后一个输入。 要解决此问题,请将其更改为:-
while (year != -1) {
if (year >= 1582) {
...
} else {
System.out.println("ERROR! YEAR MUST BE AFTER 1582!");
System.out.println("Enter a new year(Type -1 to stop): ");
year = scan.nextInt();
}
}
请缩进代码并使用花括号。
答案 1 :(得分:1)
我认为没有人会教您如何编写这样复杂的代码……使用的代码越少越好。始终尝试消除复杂性,如果您的代码中有太多难以理解的内容,请尝试寻找一种简化方法。一种方法是使if语句下的代码尽可能简短,并且永远不要使用嵌套的ifs。
当然,这是我的观点。这是一个更简单的示例,与您发布的逻辑几乎相同,只是为了进行比较。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("Enter a year after 1582 (Type -1 to stop): ");
int year = scan.nextInt();
if (year == -1) break;
if (year <= 1582) {
System.out.println("ERROR! YEAR MUST BE AFTER 1582!");
continue;
}
if (year % 4 == 0
&& (year % 100 != 0
|| year % 100 == 0
&& year % 400 == 0)) System.out.println(year + " is a leap year.");
else System.out.println(year + " is not a leap year.");
}
}
希望有帮助!
答案 2 :(得分:0)
少于1581年仅在第一个while循环中处理。
如果输入年份> = 1582,控制将转到第二个while循环。当您提供下一个输入时,没有代码可以处理year <1582的情况,并且会陷入无限循环。
建议:
重新设计代码。可能像
public class foo{
public boolean checkLeapYear(int year){
//logic to check for leapyear
}
public static void main(String[] args){
int year = 0 //initialize;
boolean result = false;
//create foo class
while(year != -1){
//Print message to enter year
year = //readinput...
if(year < 1582){
//print message to enter year >=1582
}else{
result = foo.checkLeapYear(year);
if(result){
//Print leap
}else{
//Print not leap
}
}
}
}
}
祝一切顺利。