【日撸 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.mzph.cn/bicheng/79869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 中 EXISTS (SELECT 1 FROM ...) 的用法详解

EXISTS (SELECT 1 FROM ...) 是 MySQL 中用于存在性检查的核心语法,其核心逻辑是判断子查询是否返回至少一行数据。以下从作用原理、使用场景、性能优化等方面展开解析,并结合具体示例说明。 1. 基本语法与作用原理 语法结构: SELECT 列名 F…

阿里云服务器防御是怎么做出来的?服务器攻击方式有几种?

阿里云服务器防御是怎么做出来的?服务器攻击方式有几种? 服务器防御是一个多层次、多维度的体系,通常包括以下核心措施: 1. 网络层防御 防火墙(Firewall):过滤非法流量,仅允许授权通信&#xf…

ElasticSearch深入解析(八):索引设置、索引别名、索引模板

一、索引的动态设置、静态设置 索引设置包含两部分核心内容: 静态设置(static index settings),只允许在创建索引时或者针对已关闭的索引进行设置。指动态设置(dynamic index settings),可以借助更新设置(update settings)的方式进行动态更新…

Prometheus实战教程:k8s平台手动部署Grafana

以下是一个可用于生产环境的 Kubernetes 部署 Grafana 的 YAML 文件。该配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim,确保 Grafana 的高可用性和数据持久化。 Grafana 生产部署 YAML 文件 ☆实操示例 cat grafana-deployment.yaml 登录后复制…

VSTO外接程序与VBA的联动尝试

文章目录 前言一、第一坑:安装offic2007后excel加载项找不到了二、示例1 通过Ribbon XML自定义Excel主菜单并添加新项二、示例1 总结三、示例2 创建VSTO外接程序三、示例2 总结四、示例 3 C# VSTO外接程序示例四、示例 3 总结五、实现C# 的VSTO调用VBA函数(xlam)六、…

DeepSeek驱动的金市情绪量化:NLP解析贸易政策文本的情绪传导路径

【AI观察】政策信号与市场情绪的量化关联 基于自然语言处理技术对全球财经文本的情绪分析显示,4月30日亚盘时段现货黄金价格波动率较前日下降12.3%,与技术面修正指标呈现强相关性。特政府最新关税政策调整引发市场风险偏好指数(RPI&#xff…

期末代码Python

以下是 学生信息管理系统 的简化版代码示例(控制台版本,使用文件存储数据),包含核心功能: 1. 定义学生类 class Student: def __init__(self, sid, name, score): self.sid sid # 学号 self.name name # 姓名 self.s…

zotero pdf中英翻译插件使用

最近发现一个pdf中英翻译的神器zotero-pdf2zh,按照官方安装教程走一遍的时候,发现一些流程不清楚的问题, 此文就是整理一些安装需要的文件以及遇到的问题: 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具&#xff0…

本地MySQL连接hive

1、首先需要修改MySQL的配置,允许远程连接: # 在本地MySQL服务器上执行 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到 bind-address 行,将其修改为: bind-address 0.0.0.02、在本地MySQL中创建用户并授权(注意…

Nginx核心功能2

一:正向代理 正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端Nginx的正向代理充当客户端的“中间人”,代表用户访问外部资源…

高定电视,一场关于生活方式的觉醒

需要有自己的工作室,雇用3个以上专职模特,至少15名全职员工和20名技术工匠‌; 每年都要参加巴黎高级时装周,展示至少50款原创设计; 使用的面料必须高质量、昂贵且不同寻常,设计上注重细节和个性&#x…

用PyTorch搭建卷积神经网络实现MNIST手写数字识别

用PyTorch搭建卷积神经网络实现MNIST手写数字识别 在深度学习领域,卷积神经网络(Convolutional Neural Network,简称CNN)是处理图像数据的强大工具。它通过卷积层、池化层和全连接层等组件,自动提取图像特征&#xff…

Tensorrt 基础入门

什么是tensorrt? 其他厂商: Qualcomm, Hailo, google TPU tensorrt的优劣势 使用tensorrt的pipeline tensorrt使用中存在的问题以及解决方案 tensorrt的应用场景 自动驾驶模型部署需要关注的问题: 边端硬件资源有限 散热(不能水冷) 实时性&…

Qt 显示QRegExp 和 QtXml 不存在问题

QRegExp 和 QtXml 问题 在Qt6 中 已被弃用; 1)QRegExp 已被弃用,改用 QRegularExpression Qt5 → Qt6 重大变更:QRegExp 被移到了 Qt5Compat 模块,默认不在 Qt6 核心模块中。 错误类型解决方法QRegExp 找不到改用 Q…

玩玩OCR

一、Tesseract: 1.下载windows版: tesseract 2. 安装并记下路径,等会要填 3.保存.py文件 import pytesseract from PIL import Image def ocr_local_image(image_path):try:pytesseract.pytesseract.tesseract_cmd rD:\Programs\Tesseract-OCR\tesse…

Dify 完全指南(一):从零搭建开源大模型应用平台(Ollama/VLLM本地模型接入实战)》

文章目录 1. 相关资源2. 核心特性3. 安装与使用(Docker Compose 部署)3.1 部署Dify3.2 更新Dify3.3 重启Dify3.4 访问Dify 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 Vllm 本地模型 5. 进阶应用场景6. 总结 1. 相关资源…

C++ Windows 打包exe运行方案(cmake)

文章目录 背景动态库梳理打包方案一、使用 Vcpkg 安装静态库(关键基础配置)1. 初始化 Vcpkg2. 安装静态库(注意 x64-windows-static 后缀) 二、CMakeLists.txt 关键配置三、编译四、验证 不同平台代码兼容\_\_attribute\_\_((pack…

Java学习手册:Hibernate/JPA 使用指南

一、Hibernate 和 JPA 的核心概念 实体(Entity) :实体是 JPA 中用于表示数据库表的 Java 对象。通过在实体类上添加 Entity 注解,JPA 可以将实体类映射到数据库表。例如,定义一个 User 实体类: import ja…

字符串匹配 之 拓展 KMP算法(Z算法)

文章目录 习题2223.构造字符串的总得分和3031.将单词恢复初始状态所需的最短时间 II 灵神代码模版 区别与KMP算法 KMP算法可用于求解在线性时间复杂度0(n)内求解模式串p在主串s中匹配的未知当然,由于在KMP算法中,预处理求解出了next数组,也就…

安全为上,在系统威胁建模中使用量化分析

*注:Open FAIR™ 知识体系是一种开放和独立的信息风险分析方法。它为理解、分析和度量信息风险提供了分类和方法。Open FAIR作为领先的风险分析方法论,已得到越来越多的大型组织认可。 在数字化风险与日俱增的今天,企业安全决策正面临双重挑战…