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

如何正确组合循环(Java)?,java,Java,我正试图为我的高中班写一个代码,在那里我进入一年,让程序确定它是否是闰年。我把大部分代码都记下来了,但我在把它弄对方面遇到了困难。我们不应该在1582年之前进入一年,除非我们使用的是这个标志(我使用-1作为我的标志)。每当我在输入有效年份(比如输入2000年,然后输入1581年)后输入1582年以下的年份时,程序就结束了,我不知道如何改变它。我的代码如下: import java.util.Scanner; public class Lab3_3 { /** * @param a

我正试图为我的高中班写一个代码,在那里我进入一年,让程序确定它是否是闰年。我把大部分代码都记下来了,但我在把它弄对方面遇到了困难。我们不应该在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();
      }
     }
    }
  }
 }
import java.util.Scanner;
公共类Lab3_3{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
国际年;
扫描仪扫描=新扫描仪(System.in);
System.out.println(“输入1582年后的一年(键入-1停止):”;
年份=scan.nextInt();
而(年份<1582&&year!=-1){
System.out.println(“错误!年份必须在1582之后!”);
System.out.println(“输入新的一年(键入-1停止):”;
年份=scan.nextInt();
}
如果(年份==-1)
System.out.println(“完成了!”);
其他的
而(年!=-1){
如果(年份>=1582){
布尔跳跃=假;
如果(第%4年==0){
如果(年份%100==0){
如果(年份%400==0)
闰=真;
其他的
闰=假;
}否则
闰=真;
}否则
闰=假;
如果(跳跃){
System.out.println(year+“是闰年”);
System.out.println(“输入新的一年(键入-1停止):”;
年份=scan.nextInt();
}否则{
System.out.println(year+“不是闰年”);
System.out.println(“输入新的一年(键入-1停止):”;
年份=scan.nextInt();
}
}
}
}
}

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

这部分的问题在于:-

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

请将代码缩进并使用大括号。

我认为不应该教任何人在代码。。。你用得越少越好。始终尝试消除复杂性,如果代码中有任何太难理解的内容,请尝试找到一种使其更简单的方法。实现这一点的一种方法是使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.");
    }
}
publicstaticvoidmain(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
while(true){
System.out.println(“输入1582年后的一年(键入-1停止):”;
int year=scan.nextInt();
如果(年份==-1)中断;

如果(年年小于1581年,则仅在第一个while循环中处理

如果输入年份>=1582,控件将转到第二个while循环。当提供下一个输入时,没有代码处理年份<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
                    }                 
                }
            }  
        } 
    }
    
    公共类foo{
    公共布尔校验年份(整数年){
    //用于检查leapyear的逻辑
    }
    公共静态void main(字符串[]args){
    int year=0//初始化;
    布尔结果=假;
    //创建foo类
    而(年!=-1){
    //打印消息以输入年份
    年份=//读取输入。。。
    如果(年份<1582){
    //打印消息以输入年份>=1582
    }否则{
    结果=食品检查年份(年);
    如果(结果){
    //印刷飞跃
    }否则{
    //打印而不是跳跃
    }                 
    }
    }  
    } 
    }
    

  • 祝你一切顺利。

    你不可能在这样的格式设置上取得任何进展。你能解决它吗?国旗和年份不应该是不同的变量吗?谢谢你为这个问题添加了一些理智