【Java小案例】从简到精完美判断年份是闰/平年和该年二月份有几天

news2024/12/23 15:27:29

目录

  • 前言
  • 问题描述
  • 思路分析
  • 解决方案
    • 方案一
    • 方案二
    • 方案三
    • 方案四
  • 结语

在这里插入图片描述

前言

  • 1、平年指阳历没有闰日或农历没有闰月的年份,闰年是公历中的名词,是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的,补上时间差的年份为闰年,闰年共有366天;

  • 2、平年的二月份只有28天,而闰年的二月份有29天;

  • 3、闰年的都能被4整除,而平年一般不可以,闰年分为普通闰年和世纪闰年,能被4整除但不能被100整除的年份为普通闰年,如果是世纪年,必须被400整除才是闰年,否则就是平年。

问题描述

  二月是一个有趣的月份,平年的二月有28天,闰年的二月有29天。闰年每四年一次,在判断闰年时,可以使用年份除以4,如果能够整除,则该年是闰年。

  本例要求编写一个程序,从键盘输入年份,根据输入的年份计算这一年的2月有多少天。在计算二月份天数时,可以使用日期时间类的相关方法实现。


思路分析

  使用Java的Scanner类创建一个扫描器对象,用于接受键盘数据,然后利用Scanner的nextInt方法获取输入的值,跟你的实际需求进行逻辑处理就好了。


解决方案

  根据上述的思路分析,我们直接上代码。

方案一

📌普通版

这是很多新手刚入门时最常写的,比较简略。

package com.gx.demo;

import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {
		// 创建一个扫描器对象,用于接受键盘数据
		Scanner sc = new Scanner(System.in);
		// 提示输入一个年份
		System.out.println("请输入一个年份:");
		int year = sc.nextInt();
		// 定义一个平年的天数,默认28(平年)
		int days = 28;
		// 闰年:(1)和 (2)只要满足一个就行,则表示这一年是闰年, (1)能被4整除 但不能被100整除;(2)能被400整除。
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			days++;
			// days++的含义:符合if逻辑就+1,即 = days + 1
		}
		// 输出当年二月的天数,整形和字符串拼接 输出的是字符串
		System.out.println(year + "年份的二月份共有" + days + "天");
		// 关闭输入 计算机回收资源
		sc.close();// 凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯,用完就关掉
	}
}
执行结果:(列举部分可能会出现的输入操作)
  • 1.输入一个闰年年份:2020

请输入一个年份:
2020
2020年份的二月份共有29天

  • 2.输入一个平年年份:2021

请输入一个年份:
2021
2021年份的二月份共有28天

  • 3.输入负数:-2020

请输入一个年份:
-2022
-2022年份的二月份共有28天

  • 4.输入非数字:dsaf好的

请输入一个年份:
dsaf好的
Exception in thread “main” java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at com.gx.demo.Test5.main(Test5.java:12)

抛输入不匹配异常

  • 5.输入带空格:20 20

请输入一个年份:
20 20
20年份的二月份共有29天

总结

  • 1.上面的程序并没有很好的提示输入的年份是闰年还是平年,我们只能依靠二月份的28天或29天去区分,所以接下来我们会在方案二中进行增加一个标识来区分闰年还是平年作为返回区分。

  • 2.除了1,2正常输入并且是我们想要的效果,其他的输入都是不太友好的,因此我们需要将这些可能会出现的结果考虑进去,对程序做一个兼容。那么我们怎么针对3,4,5来做一个容错呢?请看下面方案二:

方案二

📌进阶版

针对方案一的个别问题,我们对方法进行一次优化,增加部分逻辑判断。

package com.gx.demo;

import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {
		// 创建一个扫描器对象,用于接受键盘数据
		Scanner sc = new Scanner(System.in);
		// 提示输入一个年份
		System.out.println("请输入一个年份:");
		int year = 0;
		// 判断键盘输入是否是int类型,且大于0
		if (sc.hasNextInt()) {
			// 请输入一个整形数字,表示年份
			year = sc.nextInt();
			// 判断不能为负数
			if (year < 0) {
				System.out.println("输入的年份类型错误,需为正整数:");
				return;// 直接结束,不往下执行
			}
		} else {
			System.out.println("输入的年份类型错误:");
			return;// 直接结束,不往下执行
		}

		// 定义一个平年的天数,默认28(平年)
		int days = 28;
		// 定义平/闰年标识,默认是false(平年)
		boolean isleapyear = false;
		// 闰年:(1)和 (2)只要满足一个就行,则表示这一年是闰年, (1)能被4整除 但不能被100整除;(2)能被400整除。
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			isleapyear = true;
			days++;
			// days++的含义:符合if逻辑就+1,即 = days + 1
		}
		// 判断是平年/闰年
		if (isleapyear) {
			// 输出当年二月的天数,整形和字符串拼接 输出的是字符串
			System.out.println(year + "年是闰年," + "该年的二月份共有" + days + "天");
		} else {
			System.out.println(year + "年是平年," + "该年的二月份共有" + days + "天");
		}
		// 关闭输入 计算机回收资源
		sc.close();// 凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯,用完就关掉
	}
}

执行结果:(列举部分可能会出现的输入操作)
  • 1.输入一个闰年年份:2020

请输入一个年份:
2020
2020年是闰年,该年的二月份共有29天

  • 2.输入一个平年年份:2021

请输入一个年份:
2021
2021年是平年,该年的二月份共有28天

  • 3.输入负数:-2022

请输入一个年份:
-2022
输入的年份类型错误,需为正整数:

  • 4.输入非数字:dsaf好的

请输入一个年份:
dsaf好的
输入的年份类型错误:

  • 5.输入带空格:20 20

请输入一个年份:
20 20
20年是闰年,该年的二月份共有29天

总结

  • 1.方案二中增加了 isleapyear 变量标识,实现了简单区分年份对应的是闰年还是平年的判断;

  • 2.通过执行结果可以看出,方案二对方案一中的3,4点都进行了兼容判断,使用hasNextInt判断输入的是否为整数,但是由于int的范围包含负数,所以还得判断年份大于0;

  • 3.由于使用了nextInt,导致不能直接调用字符串中针对空格去除的方法,所以这一步优化将在方案三中使用nextLine来替换nextInt;

  • 4.nextInt方法根据分隔符(回车,空格等)只取出输入的流中分割的第一部分并解析成Int。

方案三

📌终极版

对输入的年份存在空格的情况进行替换空格的操作。

package com.gx.demo;

import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {
		// 创建一个扫描器对象,用于接受键盘数据
		Scanner sc = new Scanner(System.in);
		// 提示输入一个年份
		System.out.println("请输入一个年份:");
		String num = "";
		Integer year = 0;
		// 判断键盘输入是否是int类型,且大于0
		if (sc.hasNextInt()) {
			// 请输入一个整形数字,表示年份
			num = sc.nextLine();
			year = Integer.valueOf(num.replace(" ", ""));
			// 判断不能为负数
			if (year < 0) {
				System.out.println("输入的年份类型错误,需为正整数:");
				return;// 直接结束,不往下执行
			}
		} else {
			System.out.println("输入的年份类型错误:");
			return;// 直接结束,不往下执行
		}

		// 定义一个平年的天数,默认28(平年)
		int days = 28;
		// 定义平/闰年标识,默认是false(平年)
		boolean isleapyear = false;
		// 闰年:(1)和 (2)只要满足一个就行,则表示这一年是闰年, (1)能被4整除 但不能被100整除;(2)能被400整除。
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			isleapyear = true;
			days++;
			// days++的含义:符合if逻辑就+1,即 = days + 1
		}
		// 判断是平年/闰年
		if (isleapyear) {
			// 输出当年二月的天数,整形和字符串拼接 输出的是字符串
			System.out.println(year + "年是闰年," + "该年的二月份共有" + days + "天");
		} else {
			System.out.println(year + "年是平年," + "该年的二月份共有" + days + "天");
		}
		// 关闭输入 计算机回收资源
		sc.close();// 凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯,用完就关掉
	}
}

执行结果:(列举部分可能会出现的输入操作)
  • 1.输入一个闰年年份:2020

请输入一个年份:
2020
2020年是闰年,该年的二月份共有29天

  • 2.输入一个平年年份:2021

请输入一个年份:
2021
2021年是平年,该年的二月份共有28天

  • 3.输入负数:-2022

请输入一个年份:
-2022
输入的年份类型错误,需为正整数:

  • 4.输入非数字:dsaf好的

请输入一个年份:
dsaf好的
输入的年份类型错误:

  • 5.输入带空格:20 20

请输入一个年份:
20 20
2020年是闰年,该年的二月份共有29天

总结

  • 1.使用了nextLine之后,由于返回值是String类型,所以先进行类型转换,然后再调用字符串的替换replace方法去空格;

  • 2.nextLine()方法返回的是输入回车之前的所有字符,可以获得空格符,所以这里直接调用replace替换空格符就好;

  • 3.要区分Scanner中next方法、nextLine方法(常用)和nextInt方法是实际含义。

方案四

📌标准版

由于上面的问题描述中,需求标明在计算二月份天数时,可以使用日期时间类的相关方法实现,因此这里将增加一个计算天数的方法来调用。

package com.gx.demo;

import java.util.Calendar;
import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {
		// 创建一个扫描器对象,用于接受键盘数据
		Scanner sc = new Scanner(System.in);
		// 提示输入一个年份
		System.out.println("请输入一个年份:");
		String num = "";
		Integer year = 0;
		// 判断键盘输入是否是int类型,且大于0
		if (sc.hasNextInt()) {
			// 请输入一个整形数字,表示年份
			num = sc.nextLine();
			year = Integer.valueOf(num.replace(" ", ""));
			// 判断不能为负数
			if (year < 0) {
				System.out.println("输入的年份类型错误,需为正整数:");
				return;// 直接结束,不往下执行
			}
		} else {
			System.out.println("输入的年份类型错误:");
			return;// 直接结束,不往下执行
		}

		// 调用calDay方法计算天数
		int days = calDay(year);
		// 定义平/闰年标识,默认是false(平年)
		boolean isleapyear = false;
		// 闰年:(1)和 (2)只要满足一个就行,则表示这一年是闰年, (1)能被4整除 但不能被100整除;(2)能被400整除。
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			isleapyear = true;
			days = calDay(year);// 调用calDay方法计算天数,重新赋值给days
		}
		// 判断是平年/闰年
		if (isleapyear) {
			// 输出当年二月的天数,整形和字符串拼接 输出的是字符串
			System.out.println(year + "年是闰年," + "该年的二月份共有" + days + "天");
		} else {
			System.out.println(year + "年是平年," + "该年的二月份共有" + days + "天");
		}
		// 关闭输入 计算机回收资源
		sc.close();// 凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯,用完就关掉
	}

	/**
	 * 利用Calendar计算某年的二月份天数
	 * 
	 * @param year 年份
	 * @return
	 */
	public static int calDay(int year) {
		Calendar c = Calendar.getInstance();
		c.set(year, 2, 1);// year年的3月1日
		c.add(Calendar.DAY_OF_MONTH, -1);// 将3月1日往左偏移一天结果是2月的天数
		return c.get(Calendar.DAY_OF_MONTH);
	}
}
执行结果:参考方案三

  到此就完成了,代码都是很简单的判断,没啥技术难点,很适合新手入门,赶紧去试试吧!祝“码”到成功!

结语

  此方案仅供参考,你可以根据自行的需求进行优化,具体需要实现什么逻辑,继续添加就好。Scanner里面的方法还是很多的,有兴趣的朋友可以花时间去研究每个方法的含义。

在这里插入图片描述
创作不易,感谢您的点赞与支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74221.html

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

相关文章

QA | SWCF2022 笔记:GNSS模拟赋能汽车HIL测试

2022年度SWCF卫星通信与仿真测试研讨会正在进行中&#xff0c;精彩演讲&#xff1a;GNSS模拟赋能汽车HIL测试&#xff0c;感谢大家的观看与支持&#xff01;收到一些粉丝的技术问题&#xff0c;我们汇总了热点问题并请讲师详细解答&#xff0c;在此整理分享给大家&#xff01; …

高通平台开发系列讲解(UART篇)高速串口代码流程

文章目录 一、初始化1.1、Registration with the SPS driver1.2、UART port registration二、Port open三、Port close沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍高通平台高速串口代码流程。 一、初始化 初始化流程: msm_serial_hs_init() ->

数据传送指令MOV、XCHG

学习过程中要重点掌握对标志寄存器的影响 数据传送类指令&#xff08;不影响标志位&#xff09; 一&#xff1a;MOV指令 先要知道图片中这几个英文表示什么 立即数&#xff08;immediaate operand&#xff09; 寄存器&#xff08;register&#xff09; 内存&#xff08;…

WEB前端大作业HTML静态网页设计旅游景点区主题——三亚旅游网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马…

JVM八股文,面试会被问到什么?都在这里啦 ~

目录 1、JVM内存划分 1.1、程序计数器&#xff08;Program Counter Register&#xff09; 1.2、方法区&#xff08;Method Area&#xff09; 1.3、本地方法栈&#xff08;Native Method Stacks&#xff09; 1.4、虚拟机栈&#xff08;JVM Stacks&#xff09; 1.5、Java堆…

溢出的文字省略号显示

溢出的文字省略号显示 1、单行文本溢出显示省略号 源代码 必须满足三个条件&#xff1a;white-space: nowrap; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; nowrap强制一行内显示文本(默认normal自动换行)&#xff0…

vscode跨语言调试

所谓“工欲善其事&#xff0c;必先利其器”&#xff0c;作为一个程序员&#xff0c;调试在项目开发过程中的重要性自然是不言而喻的。 最近项目中遇到的项目是由python和cpp完成的&#xff0c;python端会调用到cpp的库。由于做二次开发需要进行跨语言联调&#xff0c;所以在这…

QList与QVector遍历方法与性能比较

目录 一、 性能测试 二、 QList与QVector耗时对比分析 三、QList遍历方式对比分析 四、QVector遍历方式对比分析 一、 性能测试 最近使用opengl画点云数据时发现比较卡顿&#xff0c;原因是我使用了QList数据结构&#xff0c;后面改为QVector改善很多&#xff0c;速度提升1倍。…

什么是数学思维

什么是数学 数学 [英语&#xff1a;mathematics&#xff0c;源自古希腊语μάθημα&#xff08;mthēma&#xff09;&#xff1b;经常被缩写为math或maths]&#xff0c;是研究数量、结构、变化、空间以及信息等概念的一门学科。 数学 是人类对事物的抽象结构与模式进行严格…

大学生影视主题网页制作 HTML+CSS+JS仿360影视网站 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

数据结构:排序

目录 插入排序 插入排序 希尔排序 选择排序 选择排序 堆排序 交换排序 冒泡排序 快速排序 递归实现&#xff1a; ●hoare版本 ●三数取中小区间法优化 ●挖坑版本 ●双指针版本 非递归 ●用栈实现 ●用队列实现 归并排序 ● 递归 ●非递归 总结 来了朋友&a…

slot的理解

首先&#xff0c;大概了解一下插槽&#xff1a; 插槽是什么 ![在这里插入图片描述](https://img-blog.csdnimg.cn/90b04660769e49c286ee2e1821d2a2bb.png 插槽&#xff1a;在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占…

HashMap1.8也会发生死循环

在网上搜资料时候然后发现网上都说1.7版本的HashMap会发生死链也就是死循环&#xff0c;但是在HashMap中也会产生死循环&#xff0c;接下来直接看代码吧 代码 类名字我忘记改了这是我以前看park时候弄的但是这不重要 当你运行 public class parkAndUnpark {static Map<…

微服务守护神-Sentinel-降级规则

引言 书接上篇 微服务守护神-Sentinel-流控规则 &#xff0c;上面介绍了Sentinel流控规则&#xff0c;本篇继续来Sentinel的降级规则。 降级规则 那啥为降级呢&#xff1f;降级可以理解为下降等次&#xff0c;比如&#xff1a;你从广州到北京&#xff0c;有钱时&#xff0c;…

Kafka的认证

Kafka支持基于SSL和基于SASL的安全认证机制。 基于SSL的认证主要是指Broker和客户端的双路认证。即客户端认证broker的证书&#xff0c;broker也认证客户端的证书。 Kafka还支持通过SASL做客户端认证。SASL是提供认证和数据安全服务的框架。Kafka支持的SASL机制有5种&#xff…

Docker容器化技术入门(一)Docker简介

Docker容器化技术入门&#xff08;一&#xff09;Docker简介前言&#xff08;一&#xff09;Docker简介1 Docker是什么&#xff1f;1.1 Docker的出现1.2 Docker的理念1.3 一句话2 容器与虚拟机比较2.1 容器发展简史2.2 传统虚拟机技术2.3 容器虚拟化技术2.4 对比3 Docker能干什…

华硕编程竞赛11月JAVA专场 D题飞机大战 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

org.eclipse.e4.core.di.InjectionException: Unable to proces

eclipse RCP 项目在eclipse 插件程序中正常运行&#xff0c;导出eclipse product后运行报错。路径&#xff1a;【项目名称】–>workspace–>.metadata–>.log 报错信息如下&#xff1a; !SESSION 2022-12-08 17:19:22.227 ------------------------------------------…

MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究...

全文链接&#xff1a;http://tecdat.cn/?p30766本文就将采用改进Fuzzy C-means算法对基于用户特征的微博数据进行聚类分析。去年&#xff0c;我们为一位客户进行了短暂的咨询工作&#xff0c;他正在构建一个主要基于微博用户特征聚类研究的分析应用程序&#xff08;点击文末“…