如何正确组合我的循环(Java)?

时间:2018-10-16 01:57:41

标签: java

我正在尝试为我的高中班级编写一个代码,在其中输入年份并让程序确定是否是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();
      }
     }
    }
  }
 }

3 个答案:

答案 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的情况,并且会陷入无限循环。

建议:

  1. 确保问题中的代码格式正确。
  2. 重新设计代码。可能像

    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
                    }                 
                }
            }  
        } 
    }
    

祝一切顺利。