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

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

        运行结果如下:


小结

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

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

http://www.xdnf.cn/news/4124.html

相关文章:

  • 【BUG】mmdetection ValueError: need at least one array to concatenate
  • 人事管理系统7
  • 【Python 文件I/O】
  • 【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】
  • 【AI】Ubuntu 22.04 evalscope 模型评测 Qwen3-4B-FP8
  • 上传下载接口
  • Android第六次面试总结之Java设计模式(二)
  • vue3+ts+自定义指令,生产页面水印
  • 云计算训练营笔记day02(Linux、计算机网络、进制)
  • 论文速读《Embodied-R: 基于强化学习激活预训练模型具身空间推理能力》
  • STL之stackqueue
  • 【Vue.js】 插槽通信——具名插槽通信
  • 大模型在宫颈癌诊疗全流程预测与应用研究报告
  • 免费视频压缩软件
  • Paramiko 性能优化详解
  • 神经网络之互动练习详解:从基础到拟合非线性数据
  • 【回眸】QAC使用指南——导出 Dashboard Report个性化定制Report
  • NLP中词嵌入的几个方法介绍快速入门视频推荐
  • Adobe卸载清理工具Creative Cloud Cleaner Tool下载
  • C# Winforms 本地化 多语言支持 字符串资源
  • 【商城系统中的多商户和单商户模式差异】
  • 第22节:深度学习基础-损失函数介绍
  • 神经网络:节点、隐藏层与非线性学习
  • 【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题
  • Suno v4.5:AI 音乐创作的新突破
  • PHP分页显示数据,在phpMyadmin中添加数据
  • window 显示驱动开发-线程同步和 TDR
  • 【Docker系列】使用格式化输出与排序技巧
  • 如何对 Redis 进行水平扩展和垂直扩展以应对微服务流量的增长?
  • 【ARM】DS-试用授权离线激活