从控制台输入指定年份(在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写一个万年历程序相关推荐

  1. 用JAVA写一个画图程序(课程设计)

    1.设计思路 首先我直接去了Windows自带画图程序去实践模拟,看看具体方法,进行了布局和按钮的思考. 容器顶层放工具栏,工具栏中存放图形按钮.工具按钮.颜色按钮.对于图形按钮,存放在垂直的Box中 ...

  2. java写一个android程序_【Android开发笔记】3.编写第一个Android程序

    前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...

  3. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

  4. 面试必问:用 Java 写一个内存泄漏程序

    编译:ImportNew/唐尤华 原文链接:stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java 问题: 刚参加的一 ...

  5. 用JAVA写一个画图小程序(JAVA 大作业)

    第一次写博客 且是稍微大点的程序 看看就行 重新写的在这,更加清晰明了:点击进入:用JAVA写一个画图小程序(JAVA 大作业)重排版本 设计思路 首先我直接去了Windows自带画图程序去实践模拟, ...

  6. 彩票中奖java程序 随机30选7_写一个彩票程序:30选7

    1. 写一个彩票程序:30选7.随机(1~30之间)生成7个随机数,注意不能重复.然后从键盘输入7个数,对比7个数是否与随机数有相同的.最后显示"中了几个号".同时,如果中了7个号 ...

  7. 如何用Java自己写一个.exe程序

    如何用Java自己写一个.exe程序 之前遇到要写一个 .exe程序的一个题,后面在网上查阅资料,发现Java其实也是可以转换成exe程序的,但是要借助一些工具生成,我是用exe4j生成.exe程序. ...

  8. java递归怎么写_什么是递归?用Java写一个简单的递归程序

    什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决. 递归的要素 自定义递归函数,并确定函数的基本功能 ...

  9. java实现迷你计算机,用JAVA写一个迷你编辑器.doc

    用JAVA写一个迷你编辑器 用JAVA编写一个迷你编辑器 WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧.我用JAVA写了一个编辑器程序,模仿"记事本 ...

最新文章

  1. 洛谷——P3807 【模板】卢卡斯定理
  2. Flask入门之上传文件到服务器
  3. J2EE WEBWORK FRAMEWORK安全隐患
  4. 《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
  5. java工厂模式静态工厂_Java设计模式之静态工厂模式详解
  6. java 获取js html_JS获取网页中HTML元素的几种方法
  7. bldc不同载波频率_三相BLDC弦波驱动器-PT2511
  8. 嵌入式linux ucgui,四、嵌入式之图形界面 (3) uCGui
  9. 医疗卫生行业涉及的信息数据元属性与值域代码(数据集)
  10. 黑龙江大学自考,助学专业软件工程(本科)招生简章
  11. SpringMVC工作原理概述
  12. Unity跳转App的应用市场
  13. 服务器CPU和普通CPU有什么区别?常用的服务器有六大区别
  14. frps port unavailable
  15. c 实现走迷宫流程图_[求助]:迷宫问题 流程图
  16. 随机名字获取,杜绝取名烦恼
  17. MATLAB GUIDE 面板(panel)上的控件消失问题和不靠谱的解决方案
  18. 七段数码管共阳(阴)极常用字形码
  19. OpenGL 图形库的使用(二十五)—— 高级OpenGL之帧缓冲Framebuffers
  20. 【PTA|Python】浙大版《Python 程序设计》题目集:第五章

热门文章

  1. html div 内部左右布局,div布局大全
  2. 基于大数据POI基因图谱的再生技术研究
  3. Java连接数据库及所需jar包
  4. winform直接控制云台_把生活拍成电影-智云SmoothX 自拍手持云台评测
  5. 视频教程-javascript原生初级到非凡-JavaScript
  6. 修改远程桌面3389肉鸡端口
  7. Java详解WebService技术
  8. openshift 学习笔记-2
  9. MediaSoup简介
  10. 严厉!32篇硕士论文“不合格”,同门论文将被重点抽查!