一.功能
根据用户输入的年份和月份,在控制台打印出对应月份的日历。
二.算法讲解
要打印一个月的日历只需要知道两件事。
1.这个月第一天是星期几
本例子中,使用蔡勒公式,判断某年某月的一号是周几,关于蔡勒公式不了解的同学可以百度一下,这里不作讲解。
使用"蔡勒公式"计算某月第一天是周几的好处有:
(1).不用选择参考年月日;
(2)不用计算参考日到计算日的间隔天数;
(3)不用计算一年有多少天。
2.这个月有多少天
使用switch-case语句进行判断,大月31天,小月30天,2月闰年29天,平年28天。
三.源码
import java.util.Scanner;
public class DateUtils{
/*判断是否为闰年*/
public boolean isleap(int year){
return (year%4==0)&&(year%100!=0)||year%400==0;
}
/*判断这个月有多少天*/
public int daysOfmonth(int year,int month){
switch(month){
/*大月*/
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
/*小月*/
case 4:
case 6:
case 9:
case 11:
return 30;
/*二月*/
case 2:if(isleap(year)) return 29;
else return 28;
default:
System.out.println("程序错误:输入的月份有误!");
return 0;
}
}
/**
* 蔡勒公式,判断某年某月的一号是周几
* @param year 年
* @param month 月
* @return week(0,6)
*/
private int weekOffirst(int year,int month){
int m=month;
int d=1;
if(month<=2){ /*对小于2的月份进行修正*/
year--;
m=month+12;
}
int y=year % 100;
int c=year/100;//世纪数减1
int w=(y+y/4+c/4-2*c+(13*(m+1)/5)+d-1)%7;
if(w < 0) /*修正计算结果是负数的情况*/
w+= 7;
return w;
}
/*打印日历*/
public void dataprint(int year,int month){
System.out.println("\t\t"+year+"年"+" "+month+"月");
System.out.println("日\t一\t二\t三\t四\t五\t六");
int week=weekOffirst(year,month);
int[][] data = new int[6][7] ;
int daynum=1;
for(int i=0;daynum<=daysOfmonth(year,month);i++){
for(int j=0;j<7&&daynum<=daysOfmonth(year,month);j++){
if(i==0&&j<week) {
data[i][j]=0;
System.out.print("\t");
}
else {
data[i][j]=daynum++;
System.out.print(data[i][j]+"\t");
}
}System.out.println();
}
}
/*主函数入口*/
public static void main(String[] args){
DateUtils du=new DateUtils();
Scanner scn=new Scanner(System.in);
System.out.print("输入要打印的年:");
int year=scn.nextInt();
System.out.print("输入要打印的月:");
int month=scn.nextInt();
scn.close();
du.dataprint(year, month);
}
}