实现简单的打印万年历

实现简单的打印万年历

一个刚开始学习java的小白的第一次博客。不知道写点啥,就把最近写练的小练习,拿出来。希望大佬们手下留情,给点点评,我一定努力改正!!!不过可能也没人看吧,但是我要从今天开始坚持写博客了,虽然质量差很多,但我会努力学习,进步的,加油为了没有头发而奋斗!!!为了制造bug而努力!!!还有第一次用这个Markdown编辑器还不太熟悉,可能格式有些不对,希望不要介意。

要求:

输入年份year和月份month打印出整个月的日期

简单分析

1.计算机的日历是从1900年1月1号开始计算的
2.要打印本月的日期首先需要知道本月有多少天、本月的1号是从星期几开始的
3.然后这就要先算出本月的1号距离1900年1月1号有多少天,这就又牵扯到要判断出平年和闰年了
接下来就要开始敲了

日期类public class DatePrint {}

1.需要键盘输入,首先要导包
import java.util.Scanner;
2.属性
//属性
	int year;
	int month;
3.构造方法
/*构造方法*/
	public DatePrint() {
		
	}
	public DatePrint(int year, int month) {
		this.year = year;
		this.month = month;
	}
4.键盘输入的方法

如果把keyboard关闭的话会出错,但是不关的话就会警告,现在还不会解决,等学了输入输出流我应该就会解决了吧。

/*键盘输入方法*/
	public int input() {
		//创建对象
		Scanner keyboard=new Scanner(System.in);
		int input=keyboard.nextInt();
		//keyboard.close();
		return input;
	}
5.判断平年py还是闰年

如果是闰年发会true,平年返回false

/*判断平年py还是闰年ry*/
	public boolean rpYear(int year) {
		boolean yearBoolean = false;
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			yearBoolean = true;
		}
		return yearBoolean;
	}
6.判断每个月有多少天

case 0: 是为了如果输入1月后面需要-1,计算12月份

/*判断每个月有多少天*/
	public int howMonthDay(int year, int month) {
		int monthDay = 0;
		switch (month) {
		case 0:
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			monthDay = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			monthDay = 30;
			break;
		default:
			boolean rpy = rpYear(year);
			if (rpy) {
				monthDay = 29;
			} else {
				monthDay = 28;
			}
		}
		return monthDay;
	}
7.确定整年的天数

计算输入的year-1年到1900年1月1日经历的整年的天数差的总和

/*确定整年的天数*/
	public int yearDay(int year) {
		int yearTotal=0;
		for(int i=1900;i<=year-1;i++) {
			//调用判断闰年、平年的方法
			boolean rpy=rpYear(year);
			if(rpy) {
				yearTotal+=366;
			}else {
				yearTotal+=365;
			}
		}
		return yearTotal;
	}
8.确定整月的天数

计算输入的month-1月到本年1月经历的整月的天数差的总和
这里就有可能用到上面的case 0:

/*确定整月的天数*/
	public int monthDay(int year,int month) {
		int monthTotal=0;
		for(int i=1;i<=month-1;i++) {
			monthTotal+=howMonthDay(year,i);
		}
		return monthTotal;
	}
9.确定那一天是星期几

传入那一天输出星期几
我是从星期一开始打印的所以week=0是周一

/*确定那一天是星期几*/
	public int howWerek(int day) {
		int week;
		switch ((day) % 7 + 1) {
		case 1:
			week = 0;
			break;
		case 2:
			week = 1;
			break;
		case 3:
			week = 2;
			break;
		case 4:
			week = 3;
			break;
		case 5:
			week = 4;
			break;
		case 6:
			week = 5;
			break;
		default:
			week = 6;
		}
		return week;
	}
10.打印表头
/*打印表头*/
	public void pHead(int year,int month) {
		System.out.println(year + "年" + month + "月");
		System.out.println("一\t二\t三\t四\t五\t六\t日\t");
	}
11.补充前一个月

如果1号不是星期一,需要补充前一个月的最后几天

/*补充前一个月*/
	public void pBefore(int year, int month,int week) {
		// 上个月有多少天
		int before = howMonthDay(year, month - 1);
		for (int beforeDay = before - week + 1; beforeDay <= before; beforeDay++) {
			System.out.print(beforeDay + "\t");
		}
	}
12.打印本月日期
/*打印本月日期*/
	public void print(int dayMonth,int day) {
		for(int i=1;i<=dayMonth;i++) {
			System.out.print(i+"\t");
			//每次到周日了需要换行
			if((day+i-1)%7+1==7){
				System.out.println();
			}
		}
	}
13.补充下个月
/*补充下个月*/
	public void pNext(int dayMonth,int day) {
		// 判断这个月的最后一天时星期几
		int lastWeek = howWerek(day+dayMonth+1-1);
		for (int nextDay = 1; nextDay <= (6 - lastWeek+1); nextDay++) {
			System.out.print(nextDay + "\t");
		}
	}

日期测试类public class DateTest {}

public static void main(String[] args) {	
		//创建Date对象
		DatePrint date=new DatePrint();
		//输入年份和月份
		System.out.println("请输入年份:");
		int year=date.input();
		System.out.println("请输入月份:");
		int month=date.input();
		
		//确定某年某月某日到1900.1.1经过几个整年的天数
		int yearTotal=date.yearDay(year);
		//确认某年某月(给定日期的前一个月)到该年1月1号经过多少天(z),整月的天数
		int monthTotal=date.monthDay(year,month);
		
		//确定该月有多少天
		int dayMonth=date.howMonthDay(year,month);
		//天数差
		int day=yearTotal+monthTotal+1-1;
		//确定该月的1号是星期几
		int week=date.howWerek(day);
		
		//打印日期头
		date.pHead(year,month);
		//补上个月
		date.pBefore(year,month,week);
		//打印本月
		date.print(dayMonth,day);
		//补下个月
		date.pNext(dayMonth,day);
	}

运行效果图

在这里插入图片描述
有点小激动,加油!继续努力!
只要一直在不断努力,总有一天会追上你,赶超你。送给自己,也送给正在努力奋斗的大家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值