利用分支循环制——万年历项目
技术点:变量、分支、循环
需求分析:
原理
1900年1月1日是一个星期一。根据键盘输入的年份,月份,获取到1900年1月1日的总天数。然后除以7取余数,就是1号之前的空格的数量。然后后面直接打印本月的每一天日期就可以。每当要打印的日期+前面的空格数刚好是7的倍数,就该换到下一行打印。
举例:给定年份是2020年,5月,那就是要打印2020年5月的日历。
假如每行以星期一开头。
首先要计算出2020年4月30日到1900年1月1日的总天数:43950天。
然后除以7取余数,为4。那就表示1号前有4个空格。
最后要注意换行,打印的日期数字加上前面的4个空格,如果刚好是7的倍数,就该换行了。
import java.util.Scanner;
/**
键盘上输入年份,月份,打印该月的日历
*/
public class PerpetualCalendar {
public static void main(String[] args) {
/*
* 分析:
* 2020年,5月
* 1900年1月1日到2020年4月30日的总天数
* step1:求总天数
* 1900年,2019年:整年
* 闰年:366,365
* 不足整年,月份
* 30,31,29,28
*
* step2:总天数%7,余数
* step3:打印日期
* 空格:就是上一步骤的余数
* 日历:打印数字
* 换行
*/
// step1:要先获取年份和月份的数据:
// A :先输出提示语句,并接受用户输入的年、月。
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个年份:");
int year = scan.nextInt();
System.out.println("请输入一个月份:");
int month = scan.nextInt();
// step2:要获取上个月底到1900年1月1日的总天数。
// B:用循环计算用户输入的年份距1900年1月1日的总天数。
int total = 0;//用于表示1900年1月1日到2020年4月30日的总天数。
//先求1900年到2019年到总天数
for (int i = 1900; i < year; i++) {
//判断i是否是闰年
if(i % 4 == 0 && i % 100 !=0 || i % 400 == 0){
total += 366;
}else{
total += 365;
}
}
// C:用循环计算用户输入的月份距输入的年份的1月1日共有多少天。
//再求2020年1月日到4月30日到总天数
for (int i = 1; i < month; i++) {
//判断i月到天数
switch (i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
total += 31;
break;
case 4:
case 6:
case 9:
case 11:
total += 30;
break;
case 2:
//2月要判断year是否是闰年
if(year % 4 == 0 && year % 100 !=0 || year % 400 == 0){
total += 29;
}else {
total += 28;
}
break;
}
}
// System.out.println(total);
// step3:打印日历
// D:计算出1号前到空格数量:用总天数来计算输入月的第一天的星期数。
int kong = total % 7;
// System.out.println(kong);
// E:计算当前月有多少天,格式化输出这个月的日历!
int day = 0;//要打印的这个月份的天数:2020年5月
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
//2月要判断year是否是闰年
if(year % 4 == 0 && year % 100 !=0 || year % 400 == 0){
day= 29;
}else {
day = 28;
}
break;
}
//格式化打印
/*一个中文对应两个字符*/
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\t");
// System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");
//先打印空格
for(int i =0;i<kong;i++){
System.out.print("\t\t");
}
//打印日历
for(int i= 1;i<= day;i++){
System.out.print(i+"\t\t");
//换行
if((kong+i)%7==0){
System.out.println();
}
}
}
}
run:
请输入一个年份:
2020
请输入一个月份:
7
星期一 星期二 星期三 星期四 星期五 星期六 星期日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31