需求:输入一个年份,再输入一个月份,把那个月的日历打印出来
线索:1900年1月1日是星期一
看代码的经验:
1.整体粗略的从上往下看
知道大概有哪些方法
知道这些方法大概是怎么实现的
2.仔细分析main方法里的执行顺序,不懂哪个方法就去细看哪个方法
编写方法的经验:
1.考虑方法名 -- 见名知意
2.考虑参数
参数有几个?
参数是什么类型?
3.考虑返回值
是否有返回值
返回值类型
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();//2024
System.out.println("请输入月:");
int month = scan.nextInt();//3
//计算当月第一天的星期数
int week = getWeek(year,month);
//获取当月的天数
int day = getDay(year,month);
//打印日历
printCalendar(year,month,day,week);
}
//打印日历
public static void printCalendar(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;//换行的变量
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();//换行
}
}
}
//获取星期
public static int getWeek(int year,int month){
//year - 2024
//month - 3
int allDay = getAllDay(year,month);
int week = allDay%7;
if(week == 0){
week = 7;
}
return week;
}
//获取总天数
public static int getAllDay(int year,int month){
//year - 2024
//month - 3
int allDay = getAllDayOfYear(1900,year) + getAllDayOfMonth(year,1,month) + 1;
return allDay;
}
//获取月的总天数
public static int getAllDayOfMonth(int year,int startMonth,int endMonth){
//year - 2024
//startMonth - 1
//endMonth - 3
int allDayOfMonth = 0;
for(int i = startMonth;i<endMonth;i++){
allDayOfMonth += getDay(year,i);
}
return allDayOfMonth;
}
//获取年的总天数
public static int getAllDayOfYear(int startYear,int endYear){
//startYear - 1900
//endYear - 2024
int allDayOfYear = 0;
for(int i = startYear;i<endYear;i++){
if(isLeapYear(i)){
allDayOfYear += 366;
}else{
allDayOfYear += 365;
}
}
return allDayOfYear;
}
//判断是否是闰年
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;
}