【问题标题】:Java Conditional statement (simple enough)Java 条件语句(足够简单)
【发布时间】:2016-01-11 19:05:01
【问题描述】:

我的程序是判断输入的年份是否是满足这些要求的闰年:

如果一年能被 4 整除,则为闰年。但如果该年能被 100 整除,则只有当它也能被 400 整除时,它才是闰年。

创建一个程序来检查给定年份是否为闰年。

以下是每个输入应产生的结果:

输入年份:2011 这一年不是闰年。

输入年份:2012 这一年是闰年。

输入年份:1800 这一年不是闰年。

输入年份:2000 这一年是闰年。

这是我想出的:

import java.util.Scanner;

public class LeapYear {

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);

        System.out.println(" Type a year ");
        int number = Integer.parseInt(reader.nextLine());

        if (number % 4 == 0 ) {
            System.out.println(" This is a leap year");
        } else if (number % 100 == 0 && number % 400 == 0) {
            System.out.println(" This is a leap year ");
        } else {
            System.out.println( "This is not a leap year");
        } 
    }
}  

除了 1800 之外,它们都工作。1800 不是闰年,我的程序说它是(它不能被 400 整除)。似乎 (number % 100 == 0 && number % 400 == 0) 仅在 (number % 4 == 0 ) 不存在时才有效。为什么我的程序无法正常运行?

【问题讨论】:

  • 请修正您的括号,使您的代码更具可读性!
  • 组织您的if 子句,以便首先执行最大的测试(相对于 400 年)。否则,由于 1800 % 4 == 0,它将在 if 语句的第一部分结束评估

标签: java conditional


【解决方案1】:

考虑输入 100 年会发生什么。 100 % 4 ==0TRUE,因此您的代码输出年份是闰年。问题是,100 % 100 == 0 也是TRUE,但是你的代码永远不会到达这一行,也不会检查100 % 400 == 0 是否是TRUE

您在检查所有条件之前打印了结果!

更改 if else 的结构。

这听起来像是一个家庭作业,所以我不想给你答案。您应该拥有从这里到达它所需的所有信息。如果没有,请随时对任何问题发表评论。

编辑:由于您似乎已经掌握了问题的核心,因此您的答案有什么问题。

您的括号 {} 放错了位置,等等。将括号放在我所做的位置是 Java 标准的一部分,并使您的代码更易于阅读、理解和调试。 (它也可以更容易地识别它们何时丢失。)

您的代码应如下所示:

// Pay attention to a few things here. It checks if it is divisible by 4
// since every leap year must be divisible by 4. If it is,
// it checks if it is divisible by 100. If it is, it must also
// be divisible by 400, or it is not a leap year. So, if it is divisible
// by 100 and NOT divisible by 400, it is not a leap year. If it isn't 
// divisible by 100, control flows to the else statement, and since we
// already tested number % 4 we know it is a leap year.
// Pay special attention to where I located my { and }, this is the 
// standard way to do it in java, it makes your code readable by others.

if(number % 4 == 0) {
    if((number % 100 == 0) && !(number % 400 == 0)) { // NOTE THE ! OPERATOR HERE
        System.out.println("The year is NOT a leap year.");
    } else {
        System.our.println("The year is a leap year.");
    }
} else {
    System.out.println("The year is NOT a leap year");
} 

【讨论】:

  • 感谢您的帮助,我真的只是在自学 Java,并参加课程。该课程并没有真正提供有关嵌套 if 的任何信息。我阅读了它们并看到 && 操作是相似的,但仅此而已。我花了很多时间研究这个......无论如何你能让我摆脱痛苦吗?
  • 是的,我实际上只是从我读到的内容中尝试过。让我再试一次,我会发布我的想法。
  • 记住每个能被 100 整除的数也能被 4 整除;想一想这对您需要签入的顺序意味着什么。如果您仍然无法得到它,我会提供更多帮助。
  • 抱歉,我想确保您看到了我的编辑。你的意思不是闰年吧?其他的?
  • 好的,但是其中一个打印语句不应该是“这不是闰年吗?”
【解决方案2】:

试试这个

bool isLeap = false;
if (number % 4 == 0) {
  isLeap = true;
  if (number % 100 == 0)
    isLeap = false;
  if (number % 400 == 0)
    isLeap = true;
}
if (isLeap) { //print stuff

这应该适合你。提前输出是在抢占自己的逻辑。

【讨论】:

  • 感谢您的快速回复。我认为第一个声明抢占了我。我对布尔值了解不多,所以我不确定这节课是否可以在没有它们的情况下完成。我只得到了关于 && || 的信息操作。
  • 布尔值在这里不是你的问题;这是您检查条件的顺序。顺便说一句,欢迎来到 StackOverflow!
【解决方案3】:
    import java.util.Scanner;

    public class LeapYear {

    public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);

    System.out.println(" Type a year ");
    int number = Integer.parseInt(reader.nextLine());

    if (number % 4 == 0 ) 
        if (number % 100 == 0) 
          if (number % 400 == 0)
          {
        System.out.println(" This is a leap year");
    }   else {
        System.out.println( "This is not a leap year");
    } 
}

}

给你 HC。我只是不能让它正确打印。关闭?

【讨论】:

  • 你的括号是错误的。我将编辑我的答案,向您展示它应该是什么样子。
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2015-07-21
  • 2012-06-10
  • 2017-08-06
相关资源
最近更新 更多