用Java写一个万年历程序
从控制台输入指定年份(在1900年至2099年之内)和月份,输出当月的日历。要求效果如下图所示
思路分析如下:
假设输出2020年5月份的日历。那么要求得1900年1月1日到2020年5月1日前一天的天数总和
再求总天数余7的值,结果就是2020年4月30日对应的星期数值。
第一步:获取控制台输入的数据,并判断是否合理,进行一个初步的筛选
public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入年份(1900—2099):");//1900年1月1日 星期一int year = input.nextInt();if (year >= 1900 && year <= 2099) {boolean isLeapYear = ((year%4==0&&year%100!=0)||(year%400==0))?true:false;//判断输入的年份是否是闰年System.out.print("请输入月份(1—12):");int month = input.nextInt();if(month>=1&&month<=12){}else {System.out.println("月份输入错误");}}else {System.out.println("年份输入错误");}}
第二步:计算从1900年1月1日至指定年之前的天数总和
int dayCount = 0 ;for (int i = 1900; i <year ; i++) {//计算从1900年至指定年份的天数boolean isLeap = ((i%4==0&&i%100!=0)||(i%400==0))?true:false;dayCount+= isLeap?366:365;/}
年的天数之和比较好计算,只需在0的基础上累加即可,是闰年则加366,平年则加365。
在循环结束之后,datCount的值就是总的天数之和了(目前是计算从1900年1月1日至指
定年之前的天数)。
第三步:计算指定年1月1日 至指定月份前一个月的天数之和
int maxDay = 0;for (int i = 1; i <month ; i++) {switch (i){case 2:maxDay= isLeapYear?29:28;break;case 4:case 6:case 9:case 11:maxDay= 30;break;case 1:case 3:case 5:case 7:case 8:case 10:case 12:maxDay = 31;}dayCount+=maxDay;
在for循环中嵌套一个switch case ,在月份数值累加的过程中,循环判断第i月的最大天数,
switch选择完最大天数后,将maxDay的值累加进dayCount中,最终结果dayCount的值就是1900年1月1日到指定年月份的前一个月的天数总和。
第四步:判断当月的第一天是周几
int weekDay =dayCount%7;//总天数余7表示指定月前一天是星期几
在此基础上加1,就表示当月第一天是周几。
第五步:打印日历到控制台
以2020年5月为例:如上图,在5月1日之前有(日、一、二、 三、四)共计(4+1=5)5个空缺。需要打印weekDay+1个制表符。然后继续紧接着打印日期数字:需要打印1至maxDay(需要获取当前月份的maxDay值);如上图:在打印完2,9,16,23,后需要换一次行,也即(weekday+1+j)%7=0时需要换一次行(j为打印的数值)。
System.out.println(year+"年"+month+"月"+" 的日历如下:");System.out.println("日\t一\t二\t三\t四\t五\t六\t");for (int j = 1; j <= (weekDay+1); j++) {//weekday+1表示当月第一天是星期几System.out.print("\t"); //由于是星期日开头,需打印weekDay+1个\t}switch (month) {case 2:maxDay = isLeapYear ? 29 : 28;break;case 4: case 6: case 9: case 11:maxDay = 30;break;case 1: case 3: case 5: case 7: case 8: case 10: case 12:maxDay = 31;}for (int j = 1; j <=maxDay; j++) {//打印日期数字,当System.out.print(j+"\t");if ((j+weekDay+1)%7==0){//+1的原因是因为这个日历是以周日开头,如果是以周一开头的话则不用+1System.out.println();}}
完整代码如下
import java.util.Scanner;
//控制台输入年和月,输出该月的日历
public class Test {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入年份(1900—2099):");//1900年1月1日 星期一int year = input.nextInt();if (year >= 1900 && year <= 2099) {boolean isLeapYear = ((year%4==0&&year%100!=0)||(year%400==0))?true:false;System.out.print("请输入月份(1—12):");int month = input.nextInt();if(month>=1&&month<=12){int dayCount = 0 ;for (int i = 1900; i <year ; i++) {//计算从1900年至指定年份的天数boolean isLeap = ((i%4==0&&i%100!=0)||(i%400==0))?true:false;dayCount+= isLeap?366:365;}int maxDay = 0;for (int i = 1; i <month ; i++) {switch (i){case 2:maxDay= isLeapYear?29:28;break;case 4:case 6:case 9:case 11:maxDay= 30;break;case 1:case 3:case 5:case 7:case 8:case 10:case 12:maxDay = 31;}dayCount+=maxDay;//此处共统计了指定年月距离1900年的天数}int weekDay =dayCount%7;//总天数余7表示指定月前一天是星期几System.out.println(year+"年"+month+"月"+" 的日历如下:");System.out.println("日\t一\t二\t三\t四\t五\t六\t");for (int j = 1; j <= (weekDay+1); j++) {//weekday+1表示当月第一天是星期几System.out.print("\t"); //由于是星期日开头,需打印weekDay+1个\t}switch (month) {case 2:maxDay = isLeapYear ? 29 : 28;break;case 4: case 6: case 9: case 11:maxDay = 30;break;case 1: case 3: case 5: case 7: case 8: case 10: case 12:maxDay = 31;}for (int j = 1; j <=maxDay; j++) {//打印日期数字,当System.out.print(j+"\t");if ((j+weekDay+1)%7==0){//System.out.println();}}}else {System.out.println("月份输入错误");}}else {System.out.println("年份输入错误");}}}
用Java写一个万年历程序相关推荐
- 用JAVA写一个画图程序(课程设计)
1.设计思路 首先我直接去了Windows自带画图程序去实践模拟,看看具体方法,进行了布局和按钮的思考. 容器顶层放工具栏,工具栏中存放图形按钮.工具按钮.颜色按钮.对于图形按钮,存放在垂直的Box中 ...
- java写一个android程序_【Android开发笔记】3.编写第一个Android程序
前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...
- 怎样用java写一个简单的文件复制程序
怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...
- 面试必问:用 Java 写一个内存泄漏程序
编译:ImportNew/唐尤华 原文链接:stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java 问题: 刚参加的一 ...
- 用JAVA写一个画图小程序(JAVA 大作业)
第一次写博客 且是稍微大点的程序 看看就行 重新写的在这,更加清晰明了:点击进入:用JAVA写一个画图小程序(JAVA 大作业)重排版本 设计思路 首先我直接去了Windows自带画图程序去实践模拟, ...
- 彩票中奖java程序 随机30选7_写一个彩票程序:30选7
1. 写一个彩票程序:30选7.随机(1~30之间)生成7个随机数,注意不能重复.然后从键盘输入7个数,对比7个数是否与随机数有相同的.最后显示"中了几个号".同时,如果中了7个号 ...
- 如何用Java自己写一个.exe程序
如何用Java自己写一个.exe程序 之前遇到要写一个 .exe程序的一个题,后面在网上查阅资料,发现Java其实也是可以转换成exe程序的,但是要借助一些工具生成,我是用exe4j生成.exe程序. ...
- java递归怎么写_什么是递归?用Java写一个简单的递归程序
什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决. 递归的要素 自定义递归函数,并确定函数的基本功能 ...
- java实现迷你计算机,用JAVA写一个迷你编辑器.doc
用JAVA写一个迷你编辑器 用JAVA编写一个迷你编辑器 WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧.我用JAVA写了一个编辑器程序,模仿"记事本 ...
最新文章
- 洛谷——P3807 【模板】卢卡斯定理
- Flask入门之上传文件到服务器
- J2EE WEBWORK FRAMEWORK安全隐患
- 《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
- java工厂模式静态工厂_Java设计模式之静态工厂模式详解
- java 获取js html_JS获取网页中HTML元素的几种方法
- bldc不同载波频率_三相BLDC弦波驱动器-PT2511
- 嵌入式linux ucgui,四、嵌入式之图形界面 (3) uCGui
- 医疗卫生行业涉及的信息数据元属性与值域代码(数据集)
- 黑龙江大学自考,助学专业软件工程(本科)招生简章
- SpringMVC工作原理概述
- Unity跳转App的应用市场
- 服务器CPU和普通CPU有什么区别?常用的服务器有六大区别
- frps port unavailable
- c 实现走迷宫流程图_[求助]:迷宫问题 流程图
- 随机名字获取,杜绝取名烦恼
- MATLAB GUIDE 面板(panel)上的控件消失问题和不靠谱的解决方案
- 七段数码管共阳(阴)极常用字形码
- OpenGL 图形库的使用(二十五)—— 高级OpenGL之帧缓冲Framebuffers
- 【PTA|Python】浙大版《Python 程序设计》题目集:第五章