【日撸 Java 三百行】Day 4(条件语句实战——闰年问题)
目录
Day 4:条件语句实战——闰年问题
一、基础知识及代码思路
二、代码及测试
小结
Day 4:条件语句实战——闰年问题
Task:
- if 语句的嵌套.
- 基本规律自行百度.
- 布尔类型.
一、基础知识及代码思路
1. 什么是闰年?
闰年是历法中的名词,分为普通闰年和世纪闰年。
闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。——来自百度百科
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(
故根据定义,将判断要点转化为计算机语言为:
(i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)
2. 逻辑判断——针对定义
从定义上来讲,其实只需要一个判断即可,即以下值为 true 还是 false:
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
3. 逻辑判断——针对 if-else 分析
所有程序在码码前,都应该在大脑内建立一个初步的逻辑判断流程图。
在 if-else 语句中,尤其需要注意判断的包含关系:即应该先判断较为宽松的条件,后判断较为严格的条件。梳理思路,可以得到如下流程图:
当然,如果存在梳理困难的情况,我们可以借助韦恩图来帮助我们判断包含关系。
首先可以对于年份被4整除进行排除,如果年份无法被4整除,那么直接可以判断不是闰年(图中浅天蓝色外围)。若被4整除了,我们讨论的范围就进入的4倍数的区域,这个区域内要额外考虑100倍数问题(进入浅黄色区域)。
这里的else if语句不能直接用“余100”判断,因为“余100”直接会包含的浅黄色及其内的肉色全部区域,这样无法分离出内部的“400倍数”。
因此必须额外判断年份是否被400整除,若可以(进入最内部的肉色区域),就是闰年。
所以,真正好的if-else if-else语句要正确包含韦恩图最大的范围与最小的范围,并且从if到else过程可以映射为韦恩图的从最大区域到最小区域的过程。
二、代码及测试
需要说明的是,为了培养良好的代码结构以及代码习惯,我们这里依旧将判断封装为一个函数,即:
/************************ Is the given year leap?* * @param paraYear The given year.**********************/public static boolean isLeapYear(int paraYear) {if ((paraYear % 4 == 0) && (paraYear % 100 != 0) || (paraYear % 400 == 0)) {return true;} else {return false;} // Of if}// Of isLeapYear/************************ Is the given year leap? Replace the complex condition with a number of if.* * @param paraYear The given year.**********************/public static boolean isLeapYearV2(int paraYear) {if (paraYear % 4 != 0) {return false;} else if (paraYear % 400 == 0) {return true;} else if (paraYear % 100 == 0) {return false;} else {return true;} // Of if}// Of isLeapYearV2
整体代码如下:
package basic;/*** The usage of sth.** @author: Changyang Hu joe03@foxmail.com* @date created: 2025-05-06*/
public class isLeapYear {/************************ The entrance of the program.* * @param args Not used now.**********************/public static void main(String args[]) {// Test isLeapYearint tempYear = 2021;System.out.print("" + tempYear + " is ");if (!isLeapYear(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2000;System.out.print("" + tempYear + " is ");if (!isLeapYear(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2100;System.out.print("" + tempYear + " is ");if (!isLeapYear(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2004;System.out.print("" + tempYear + " is ");if (!isLeapYear(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");// Test isLeapYearV2System.out.println("Now use the second version.");tempYear = 2021;System.out.print("" + tempYear + " is ");if (!isLeapYearV2(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2000;System.out.print("" + tempYear + " is ");if (!isLeapYearV2(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2100;System.out.print("" + tempYear + " is ");if (!isLeapYearV2(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");tempYear = 2004;System.out.print("" + tempYear + " is ");if (!isLeapYearV2(tempYear)) {System.out.print("NOT ");} // Of ifSystem.out.println("a leap year.");}// Of main/************************ Is the given year leap?* * @param paraYear The given year.**********************/public static boolean isLeapYear(int paraYear) {if ((paraYear % 4 == 0) && (paraYear % 100 != 0) || (paraYear % 400 == 0)) {return true;} else {return false;} // Of if}// Of isLeapYear/************************ Is the given year leap? Replace the complex condition with a number of if.* * @param paraYear The given year.**********************/public static boolean isLeapYearV2(int paraYear) {if (paraYear % 4 != 0) {return false;} else if (paraYear % 400 == 0) {return true;} else if (paraYear % 100 == 0) {return false;} else {return true;} // Of if}// Of isLeapYearV2}// Of class LeapYear
运行结果如下:
小结
闰年计算是计算机语言关于条件语句与逻辑学习的典型案例,从中无论是初学者还是后来学习的人都应当深深体会程序语言逻辑的合理性已经对于问题的基本抽象。
虽然这是个非常基础的计算机问题,但是以小见大,其中对于问题的抽象能力以及建立正确判断逻辑的能力是贯通始终的。从最简单的练习开始打牢基础,才能在之后的学习生涯中游刃有余的处理更加复杂的问题。