当前位置: 首页 > news >正文

【日撸 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

        运行结果如下:


小结

        闰年计算是计算机语言关于条件语句与逻辑学习的典型案例,从中无论是初学者还是后来学习的人都应当深深体会程序语言逻辑的合理性已经对于问题的基本抽象。

        虽然这是个非常基础的计算机问题,但是以小见大,其中对于问题的抽象能力以及建立正确判断逻辑的能力是贯通始终的。从最简单的练习开始打牢基础,才能在之后的学习生涯中游刃有余的处理更加复杂的问题。

相关文章:

  • ORACLE EBS 12.1 启用https 简单策略
  • STM32H743单片机实现ADC+DMA多通道检测+事件组
  • nut-list和nut-swipe搭配:nut-cell侧滑定义无法冒泡打开及bug(含代码、案例、截图)
  • 继电器负载知识
  • 内存的位运算
  • Dify - Stable Diffusion
  • 未来设计新篇章!2025 年 UX/UI 设计趋势,技术与体验的全新结合!
  • 基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南
  • 通过CIDR推出子网掩码和广播地址等
  • 【quantity】1 SI Prefixes 实现解析(prefix.rs)
  • 网络的搭建
  • BBS (cute): 1.0.2靶场渗透
  • [Linux]多线程(一)充分理解线程库
  • TCP数据报
  • 开发积分商城为商家带来的多重优势
  • 2.4线性方程组
  • CAN通信
  • Twin Builder 中的电池等效电路模型仿真
  • 如何在 Vue3 中更好地使用 Typescript
  • 【计算机网络 第8版】谢希仁编著 第四章网络层 地址类题型总结
  • 宁合两大都市圈交汇之城含山:要想身体好,常往含山跑
  • 从黄土高原到黄浦江畔,澄城樱桃品牌推介会明日在上海举办
  • 中国证监会:帮助受关税政策影响较大的上市公司纾困解难
  • 云南昆磨高速发生交通事故致3辆车起火,昆明消防:幸无人员伤亡
  • 德国联邦议院6日下午将举行总理选举第二轮投票
  • 我国科研团队发布第四代量子计算测控系统