知识点:
- 输入语句
- 输出语句
- 局部变量
- 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");
}
}
}