需求
输入年和月,打印当月的日历
线索
1900年1月1日是星期一
分析
输入年和月
计算出1900年1月1日到输入年和月的第一天的总天数
计算1900年(包含)到输入年(排他)的总天数
计算1月到输入月(排他)的总天数
合并总天数
计算出当月的第一天是星期几
计算当月的天数
打印日历
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
输入年和月
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();
System.out.println("请输入月:");
int month = scan.nextInt();
//计算1900年1月1日到输入年输入月的第一天的总数
int allDay = getAllDay(year,month);
//计算星期几
int week = getWeek(allDay);
//计算当月的天数
int day = getDay(year,month);
//打印日历
printCalender(year,month,day,week);
}
//判断是否是闰年的方法
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0) {
return true;
}
return false;
}
//获取当月天数
public static int getDay(int year,int month) {
int day = 0;
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:
if(isLeapYear(year)) {
day = 29;
}else {
day = 28;
}
break;
}
return day;
}
//计算1900年(包含)到输入年(排他)的总天数
public static int getAllDayOfYear(int year) {
int allDayOfYear = 0;
for(int i=1900;i<year;i++) {
if(isLeapYear(i)) {
allDayOfYear += 366;
}else {
allDayOfYear += 365;
}
}
return allDayOfYear;
}
//计算1月到输入月的
public static int getAllDayOfMonth(int year,int month) {
int allDayOfMonth = 0;
for(int i=1;i<month;i++) {
allDayOfMonth += getDay(year,i);
}
return allDayOfMonth;
}
//合并总天数
public static int getAllDay(int year,int month) {
int allDay = getAllDayOfYear(year)+getAllDayOfMonth(year,month)+1;
return allDay;
}
//计算星期
public static int getWeek(int allDay) {
int week = allDay%7;
if(week==0) {
week = 7;
}
return week;
}
//打印日历
public static void printCalender(int year,int month,int day,int week) {
System.out.println(year+"年"+month+"月");
System.out.println("一\t二\t三\t四\t五\t六\t日");
int count = 0;//换行的计算器(逢7换行)
//打印空格
for(int i=1;i<week;i++) {
System.out.print("\t");
count++;
}
//打印日期
for(int i=1;i<=day;i++) {
System.out.print(i+"\t");
count++;
if(count%7==0) {
System.out.println();//换行
}
}
}
}
使用方法将代码分成几个模块,以此来减少代码冗余