有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正试图为我的高中班写一个代码,在那里我进入一年,让程序确定这是否是闰年。我把大部分代码都记下来了,但我在把它弄对方面遇到了困难。我们不应该在1582年之前进入一年,除非我们使用的是国旗(我使用-1作为我的国旗)。每当我在输入有效年份(比如输入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) 个答案

  1. # 1 楼答案

    只是修复你的代码,而不是试图想出最好的方法来解决这个问题,因为网上有无数这样做的例子

    问题在于这一部分:

    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();
        }
    }
    

    请把代码缩进并用大括号括起来

  2. # 2 楼答案

    1581年以下的年份仅在第一个while循环中处理

    如果输入年份>;=1582控制转到第二个while循环。当您提供下一个输入时,没有代码处理年份<;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
                      }                 
                  }
              }  
          } 
      }
      

    祝你一切顺利

  3. # 3 楼答案

    我认为不应该教任何人在代码。。。你用得越少越好。如果代码中有什么太难理解的地方,请设法消除复杂性,并设法使其更简单。实现这一点的一种方法是使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.");
        }
    }
    

    希望有帮助