文章目录

    • 题目:已知1900年1月1日是星期一,求2019年10月的日历。
    • 1.已知1900.1.1是星期一,那么2019.10.1是星期几呢?
    • 2.从1900.1.1 到 2019.10.1 有多少天呢?
      • 代码如下:
    • 3.得到总天数,我们就可以根据之前得到的规律,计算出 星期几 了!
    • 4.开始打印日历啦!
      • 代码如下:
    • 5.好啦!最后我们整理一下变量,汇总一下代码~
    • 6.通过Interllij Idea 2019.1.3-jbr8 测试运行结果截图为:
    • 扩展:上面的程序只完成了定向的日历,其实没有实现真正的万年历!我们只需稍作修改即可!代码如下,自己思考吧~
  • 结语
    • 感谢您花时间阅读我的文章!
    • 如果本文对您有用,请您推广我的 Hexo 博客。谢谢!
    • https://liuandcolin630.github.io/

题目:已知1900年1月1日是星期一,求2019年10月的日历。

1.已知1900.1.1是星期一,那么2019.10.1是星期几呢?

我们来利用循环推导一下,不要怕麻烦,多写几遍自然会得出规律的!

           天数(第几天)   星期几
1900.1.1        1       星期1
1900.1.2        2       星期2
1900.1.3        3       星期3
1900.1.4        4       星期4
1900.1.5        5       星期5
1900.1.6        6       星期6
1900.1.7        7       星期0
1900.1.8        8       星期1
1900.1.9        9       星期2
1900.1.10       10      星期3
1900.1.11       11      星期4
1900.1.12       12      星期5
1900.1.13       13      星期6
1900.1.14       14      星期0
1900.1.15       15      星期1
1900.1.16       16      星期2
...

截止到这里,我们能发现,经过不懈努力我们肯定能够推算出 2019.10.1 是星期几,但我们肯定不会一直的往下推导了!
我们发现了一个规律:天数%7 等于 星期几

2.从1900.1.1 到 2019.10.1 有多少天呢?

我们拆分一下:

a.1900 —— 2018 整个年份包含多少天?(即1900.1.1 —— 2018.12.31)。
b.2019.1 —— 2019.9 整个月份包含多少天?(即2019.1.1 —— 2019.9.30)。
c.最后 +1 天就是 2019.10.1 这一天了。

我们可以发现,a.b两个步骤都需要用循环来实现。那么循环操作 和 循环条件 是怎样的呢?先不要接着往下看,暂停一下,自己思考一下~!

代码如下:

a.1900.1.1 - 2018.12.31 整年天数

//一年有365/366天;闰年是366天for (i = 1900; i < years; i++) {//如果一个年份能够4整除且不能被100整除  或   一个数字能被400整除if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {days += 366;} else {days += 365;}}

b.2019.1.1 - 2019.9.30 整月天数

//12个月份中:1.3.5.7.8.10.12月为31天;2月分为闰年29天/非闰年28天;4.6.9.11月为30天for (i = 1; i < months; i++) {if (i == 2) {if ((years % 4 == 0 && years % 100 != 0) || years % 400 == 0) {days += 29;} else {days += 28;}} else {switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:days += 31;break;case 4:case 6:case 9:case 11:days += 30;break;}}}

c.到9月30日为days,则10月1日为

        days++;

3.得到总天数,我们就可以根据之前得到的规律,计算出 星期几 了!

天数%7 等于 星期几

xingQi = days % 7;

4.开始打印日历啦!

首先在百度上搜索一下 日历 ,观察它的格式。我得到了几个关于日历的规则!

  • 每周的星期顺序。

    (此处我稍微调整了一下星期的顺序,每周从星期天开始,而不是传统的从星期一开始)

      0         1       2       3       4       5       6
    星期天 星期一 星期二 星期三 星期四 星期五 星期六
    
  • 每一行有7天,每月1号之前会有几个空格(占位符),而且占位符的个数就是星期几。

    比如2019年8月:

      星期日     星期一     星期二     星期三     星期四     星期五     星期六\t\t         \t\t        \t\t        \t\t          1           2           34              5           6           7           8           9           10...
    
  • 占位符 + 星期 等于 7时会换行。(即每7天换一行)

代码如下:
  • 每周的星期顺序。
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
  • 每一行有7天,每月1号之前会有几个空格(占位符),而且占位符的个数就是星期几。
for (int i = 0; i < xingQi; i++) {System.out.print("\t\t");
}
  • 占位符 + 星期 等于 7时会换行。
//数字1 - 每月多少天(日期)for (int i = 1; i <= daysOfMonth; i++) {System.out.print(i + "\t\t");if ((xingQi + i) % 7 == 0) {System.out.println();//回车}}

5.好啦!最后我们整理一下变量,汇总一下代码~

package Project;public class PerpetualCalendar {private static int years = 2019;private static int months = 10;private static int days = 0;private static int xingQi;private static int i;private static int daysOfMonth;public static void main(String[] args) {//1900.1.1 - 2018.12.31     整年天数//一年有365/366天 闰年是366天for (i = 1900; i < years; i++) {//如果一个年份能够4整除且不能被100整除  或   一个数字能被400整除if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {days += 366;} else {days += 365;}}//2019.1.1 - 2019.10    整月天数//12个月份中 1.3.5.7.8.10.12月为31天    2月 闰年29天/非闰年28天 4.6.9.11月为30天for (i = 1; i < months; i++) {if (i == 2) {if ((years % 4 == 0 && years % 100 != 0) || years % 400 == 0) {days += 29;} else {days += 28;}} else {switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:days += 31;break;case 4:case 6:case 9:case 11:days += 30;break;}}}//到9月30日为days,则10月1日为 days++days++;xingQi = days % 7;System.out.println("1900年1月1日到2019年10月1日的天数为" + days);System.out.println("2019年10月1日为星期" + xingQi);//开始打印日历System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//星期几前面有空格,然后再星期几for (i = 0; i < xingQi; i++) {System.out.print("\t\t");}//定义当月有多少天daysOfMonth = -1;if (months == 1 || months == 3 || months == 5 || months == 7 || months == 8 || months == 10 || months == 12) {daysOfMonth = 31;} else if (months == 4 || months == 6 || months == 9 || months == 11) {daysOfMonth = 30;} else {if ((years % 4 == 0 && years % 100 != 0) || years % 400 == 0) {daysOfMonth = 29;} else {daysOfMonth = 28;}}//数字1 - 每月多少天(日期)for (i = 1; i <= daysOfMonth; i++) {System.out.print(i + "\t\t");if ((xingQi + i) % 7 == 0) {System.out.println();}}}
}

6.通过Interllij Idea 2019.1.3-jbr8 测试运行结果截图为:


扩展:上面的程序只完成了定向的日历,其实没有实现真正的万年历!我们只需稍作修改即可!代码如下,自己思考吧~

package Project;import java.util.Scanner;public class PerpetualCalendar {private static int years;private static int months;private static int days = 0;private static int xingQi;private static int input;private static int i;private static int daysOfMonth;public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输入年份:");years = input.nextInt();System.out.println("请输入月份:");months = input.nextInt();//1900.1.1 - 2018.12.31     整年天数//一年有365/366天 闰年是366天for (i = 1900; i < years; i++) {//如果一个年份能够4整除且不能被100整除  或   一个数字能被400整除if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {days += 366;} else {days += 365;}}//2019.1.1 - 2019.10    整月天数//12个月份中 1.3.5.7.8.10.12月为31天 2月 闰年29天/非闰年28天 4.6.9.11月为30天for (i = 1; i < months; i++) {if (i == 2) {if ((years % 4 == 0 && years % 100 != 0) || years % 400 == 0) {days += 29;} else {days += 28;}} else {switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:days += 31;break;case 4:case 6:case 9:case 11:days += 30;break;}}}//到9月30日为days,则10月1日为 days++days++;xingQi = days % 7;System.out.println("1900年1月1日到" + years + "年" + months + "月1日的天数为" + days);System.out.println(years + "年" + months + "月1日为星期" + xingQi);//开始打印日历System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//星期几前面有空格,然后再星期几for (i = 0; i < xingQi; i++) {System.out.print("\t\t");}//定义当月有多少天daysOfMonth = -1;if (months == 1 || months == 3 || months == 5 || months == 7 || months == 8 || months == 10 || months == 12) {daysOfMonth = 31;} else if (months == 4 || months == 6 || months == 9 || months == 11) {daysOfMonth = 30;} else {if ((years % 4 == 0 && years % 100 != 0) || years % 400 == 0) {daysOfMonth = 29;} else {daysOfMonth = 28;}}//数字1 - 每月多少天(日期)for (i = 1; i <= daysOfMonth; i++) {System.out.print(i + "\t\t");if ((xingQi + i) % 7 == 0) {System.out.println();}}}
}

##通过Interllij Idea 2019.1.3-jbr8 测试运行结果截图为:

结语

至此,Java基础实战(一):万年历 已完成!

感谢您花时间阅读我的文章!

如果本文对您有用,请您推广我的 Hexo 博客。谢谢!

https://liuandcolin630.github.io/

Java基础实战(一):万年历相关推荐

  1. Java基础实战Bank项目01-04

    Bank01: 创建一个简单的银行程序包 实验目的: Java 语言中面向对象的封装性及构造器的创建和使用. 实验说明: 在这个练习里,创建一个简单版本的 Account 类.将这个源文件放入 ban ...

  2. java 基础实战_Java基础实战(三)

    是 否 是 否 是 否 是 否 获取字符串 字符数组 大写? 小写? 数字? 非字母与数字 大写字母 小写字母 数字 i 结束 i=i+1 第一步 拆分字符串为字符数组: static void co ...

  3. java基础实战项目一:实现家庭记账本的简易记账功能

    一.对照参考代码之后体会到自己面向过程的思维. * 示例代码学习经验* 1. 抽象出变量对象 details明细.账户收支* 2. 抽象出方法:* 读取收支金额:readNumber()* 读取收支明 ...

  4. java基础实战练习_JAVA入门第三季第七章实战练习

    首先,先创建一个Gammer类与一个Poker类. /* * Gammer类包含int类型的id属性与String类型的name属性! * id用int类型是为了测试后面创建用户时输入异常的情况. * ...

  5. java打印输出万年历_Java基础之打印万年历的简单实现(案例)

    Java基础之打印万年历的简单实现(案例) 问题:输入年,月,打印对应年月的日历. 示例: 问题分析: 1,首先1970年是Unix系统诞生的时间,1970年成为Unix的元年,1970年1月1号是星 ...

  6. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)

    MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...

  7. string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  9. [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[文件保存](1)

    MIS信息管理系统实战开发之单独使用文件实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有工 ...

最新文章

  1. 自学python爬虫要多久-入门Python爬虫要学习多久?
  2. 番茄工作法—《可以量化的管理学》
  3. 阿里云Https部署网站
  4. C语言程序设计基础练习题
  5. SharePoint 2010多语言包的安装
  6. 从内部重启python脚本
  7. 经典排序 —— 选择排序
  8. apktool d test.apk报错:Unsupported major.minor version 52.0
  9. Prototype使用Form操作表单
  10. 词法分析器java语言_Java语言词法分析器
  11. js案例练习:跟随鼠标移动的小天使
  12. vue项目使用i18n插件实现多语言切换功能
  13. Squoosh - 谷歌出品的免费开源图片压缩工具,图片大小减少90%!支持 API 开发调用
  14. rtx2060为什么叫智商卡_显卡怎么选,GTX1660TI亦是RTX2060?
  15. 一款好的软件,软件测试必不可少...
  16. ZipFile 解压多个.zip压缩文件
  17. 微擎支付返回商户单号_微信小程序支付流程
  18. IDEA使用问题 —— Inspection info 波浪线
  19. (iptables)火墙策略读取的先后顺序 + 引入数据包状态
  20. 【愚公系列】2023年01月 Java教学课程 016-break和continue

热门文章

  1. html5是万维网的核心语言,html5是什么语言
  2. Linux小小白入门教程(十五):用户和用户组
  3. 学习进程和计划任务管理
  4. linux 内核抢占分析
  5. Django:Filters(过滤器)
  6. vue管道管道符和filters过滤器的简单使用
  7. Python 一元二次方程
  8. python初学者:打印9*9乘法表的三种方法
  9. 基于VHDL的8×8led点阵的简易动态图画
  10. 用户认证与授权(登录功能)