【第一阶段项目】万年历

知识点:

  • 输入语句
  • 输出语句
  • 局部变量
  • if,switch结构
  • for循环

要求:
在这里插入图片描述
–>已知1900.1.1是星期一;

难点:

怎么知道某一年的某一个月的每一天是星期几?
怎么将其打印输出?

算法思路:
想知道某一天星期几,需要算出这一天距离1900.1.1(包含这一天)过去了n天,例:n%7=6,那么这一天就是星期六===>
分2步(以2020年6月为例):
第一步:

  • 算出[1900.1.1,2020.1.1)的天数m天
  • 算出[2020.1.1,2020.6.1)到2020.1.1的天数n天
    那么,1900.1.1到2020.6.1的总天数sumDay=m+n+1;

第二步:

  • 算出这个月的每一天是星期几(利用循环)

想要打印输出图中形式,===>
分2步(以2020年6月为例):

第一步:

  • 算出每个月1号是星期几,然后算出前面有多少个空格.

第二步:

  • 每到星期六(星期天)换行
/**
此代码实现的是以星期一开头的万年历
*/

public class Calerndar {
	public static void main(String[] args) {
		System.out.println("--------欢迎来到万年历---------");
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入年份");
		int year = sc.nextInt();
		System.out.println("请输入月份");
		int month = sc.nextInt();
		System.out.println("您输入的是" + year + "年" + month + "月");
		int sumDay = 0;// 表示距离1900.1.1的总天数

		// 因为接下来需要算出2020.6.1距离1900.1.1(包含这一天)过去了多少天

		// 1.1900年到2019年过去了第m天
		// 2.2020.6.1是2020的第n天
		// 1900到2020.6.1的前一天总天数= n+m

		/* 1900到2019的m天 */
		for (int i = 1900; i < year; i++) {
			if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)){
				sumDay += 366;
			} else {
				sumDay += 365;
			}
		}
		/* 2020.6.1是2020年的第n天 */
		for (int i = 1; i < month; i++) {
			switch (i) {
			case 2:
				// 需要知道今年是不是闰年
				if ((year % 4 == 0 && year % 100 != 0 )|| (year % 400 == 0))
					sumDay += 29;
				else
					sumDay += 28;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				sumDay += 30;
				break;

			default:
				sumDay += 31;
				break;
			}
		}
		
		// 接下来需要算出这个月1号前有多少个星期被空格占住位置
		// 怎么算?需要知道这个月的第一天是星期几
		
		System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期天\t");
		// 星期天的余数为0,不会进如循环,而实际上前面需要6个空格
		int weekDay = (sumDay + 1) % 7 == 0 ? 7 : (sumDay + 1) % 7;
			for (int i = 1; i < weekDay; i++) {
				System.out.print("\t");
			}
		// 需要知道当月有多少天
		int monthDay = 0;// 用来记录当月有多少天
		switch (month) {
		case 2:
			// 需要知道今年是不是闰年
			if (year % 4 == 0 && year % 100 != 100 || year % 400 == 0)
				monthDay = 29;
			else
				monthDay = 28;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			monthDay = 30;
			break;

		default:
			monthDay = 31;
			break;
		}

		for (int i = 1; i <= monthDay; i++) {
			//为什么要在这里进行sumDay+1;
			sumDay++;
			if (sumDay % 7 == 0)
				System.out.print(i + "\n");
			else
				System.out.print(i + "\t");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值