Java基础实战(一):万年历
文章目录
- 题目:已知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基础实战(一):万年历相关推荐
- Java基础实战Bank项目01-04
Bank01: 创建一个简单的银行程序包 实验目的: Java 语言中面向对象的封装性及构造器的创建和使用. 实验说明: 在这个练习里,创建一个简单版本的 Account 类.将这个源文件放入 ban ...
- java 基础实战_Java基础实战(三)
是 否 是 否 是 否 是 否 获取字符串 字符数组 大写? 小写? 数字? 非字母与数字 大写字母 小写字母 数字 i 结束 i=i+1 第一步 拆分字符串为字符数组: static void co ...
- java基础实战项目一:实现家庭记账本的简易记账功能
一.对照参考代码之后体会到自己面向过程的思维. * 示例代码学习经验* 1. 抽象出变量对象 details明细.账户收支* 2. 抽象出方法:* 读取收支金额:readNumber()* 读取收支明 ...
- java基础实战练习_JAVA入门第三季第七章实战练习
首先,先创建一个Gammer类与一个Poker类. /* * Gammer类包含int类型的id属性与String类型的name属性! * id用int类型是为了测试后面创建用户时输入异常的情况. * ...
- java打印输出万年历_Java基础之打印万年历的简单实现(案例)
Java基础之打印万年历的简单实现(案例) 问题:输入年,月,打印对应年月的日历. 示例: 问题分析: 1,首先1970年是Unix系统诞生的时间,1970年成为Unix的元年,1970年1月1号是星 ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)
MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...
- string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 《Java和Android开发实战详解》——1.2节Java基础知识
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[文件保存](1)
MIS信息管理系统实战开发之单独使用文件实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有工 ...
最新文章
- 自学python爬虫要多久-入门Python爬虫要学习多久?
- 番茄工作法—《可以量化的管理学》
- 阿里云Https部署网站
- C语言程序设计基础练习题
- SharePoint 2010多语言包的安装
- 从内部重启python脚本
- 经典排序 —— 选择排序
- apktool d test.apk报错:Unsupported major.minor version 52.0
- Prototype使用Form操作表单
- 词法分析器java语言_Java语言词法分析器
- js案例练习:跟随鼠标移动的小天使
- vue项目使用i18n插件实现多语言切换功能
- Squoosh - 谷歌出品的免费开源图片压缩工具,图片大小减少90%!支持 API 开发调用
- rtx2060为什么叫智商卡_显卡怎么选,GTX1660TI亦是RTX2060?
- 一款好的软件,软件测试必不可少...
- ZipFile 解压多个.zip压缩文件
- 微擎支付返回商户单号_微信小程序支付流程
- IDEA使用问题 —— Inspection info 波浪线
- (iptables)火墙策略读取的先后顺序 + 引入数据包状态
- 【愚公系列】2023年01月 Java教学课程 016-break和continue