上机练习:实现万年历
import java.util.Scanner;
public class Assignment {
public static void main(String[] args) {
//思路:
//1、构建Scanner扫描器类的对象
Scanner input = new Scanner(System.in);
//2、从控制台接收用户录入的年份、月份
System.out.println("输入年");
int year = input.nextInt();
System.out.println("输入月");
int month = input.nextInt();
//获取1900s距当前年份的上一年的总天数
int totalDays = getFromLastYearTo1900TototalDays(year);
//获取当前年份经过的总天数
int totalDaysNowYear = getNowYearPassedTototalDays(year, month);
//获取给定月份的第一天的星期数
int week = (totalDays+totalDaysNowYear + 1) % 7;//一周有7天所以%7
//格式化输出日历:
formatCalendarOutput(week, year, month);
}
public static void formatCalendarOutput(int week,int year,int month){
int count=0;//计算空格和日期数的和
//打印表头:
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
//打印空格(星期之间空格个数的规律)
for (int i = 1; i <=week ; i++) {
System.out.println("\t\t");
count++;
}
//打印日历
for (int i = 1; i <=getNowMonthTototalDays(year,month) ; i++) {
System.out.print(i+"\t\t");
count++;
if (count%7==0){
System.out.println();
}
}
}
//判断给定的年份是否是闰年
//闰年为true,否则为false
public static boolean isLeapYear(int year){
return(year%4==0)&&(year%400==0&&year%100!=0);
}
//根据参数指定的年份,月份,求出当前月的总天数
public static int getNowMonthTototalDays(int year,int month){
switch (month){
case 2:
return isLeapYear(year)?29:28;
case 4:
case 6:
case 9:
case 11: return 30;
default:
return 31;
}
}
//获得当前年份的上一年距离1900年所经过的总天数
public static int getFromLastYearTo1900TototalDays(int year){
int totalDays=0;
for (int i = 1900; i <year ; i++) {
totalDays+=isLeapYear(i)?366:365;
}
return totalDays;
}
//求出当前年份经过的总天数(从当前年的1月1日到给定月份的上一个月最末一天)
public static int getNowYearPassedTototalDays(int year,int month){
int totalDays=0;
for (int i = 1; i <month ; i++) {
totalDays+=getNowMonthTototalDays(year,i);
}
return totalDays;
}
}