根据用户输入的年份和月份,显示出当月的信息,这里有比较详细的注释,所以不再一一解释了,代码如下:
package homework;
import java.util.Scanner;
public class myFirstCalendar{
public static void main(String[] args) {
int year=0 ; //用来接收用户所输入的年份,先初始化为0;
int month = 0; //用来接收用户所输入的月份
int alldays = 0; //定义一个求总天数的变量,初始赋值为0;用来累加总天数
int yearnumber ; //定义一个基准变量时间年,待会赋初值为1900年,在它的基础上累加年,进而求年的天数;
int n; //待会用来打印月历的body
int week ; //记录星期几
int monthOfDay ; //用来计算当月天数
boolean isLeapYear = false;//定义一个布尔型的变量,用来判断是平年还是闰年,等会要用到3次
Scanner input = null;
System.out.println("请输入年份 :"); //提示用户输入年份
input = new Scanner(System.in);
if (input.hasNextInt()) {
year = input.nextInt(); //用户输入后,把输入的值付给year
}
System.out.println("请输入月份 :");//提示用户输入月份
if (input.hasNextInt()) {
month = input.nextInt(); //用户输入后,把输入的值付给month
}
input.close(); //用户输入年份和月份后关闭输入
/*
累加从1900年开始,到用户输入的年份结束为止的间隔的这些年的总天数
*/
for (yearnumber = 1900; yearnumber < year; yearnumber++) {
//判断从1900年开始,以后的每一年是否是闰年,一直到用户输入的前一年完
if ((yearnumber % 4 == 0 && yearnumber % 100 != 0) || (yearnumber % 400 == 0)) {
isLeapYear = true;
} else {
isLeapYear = false;
}
if (isLeapYear) {
alldays = alldays + 366; //如果是闰年,则加上366天
} else {
alldays= alldays + 365; //否则,加上365天
}
}
//计算月份的天数
//判断用户所输入的年份是不是闰年;为待会计算用户所输入年份的月份天数
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
isLeapYear = true; }
for (int i = 1;i < month; i++) { //累计从1月开始到用户所输入的月份的前一个月的总天数
switch (i) { //用switch分支语句判断月份的天数
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: //如果是以上几个月,则当月的总天数为31天
alldays = alldays + 31; break; //如果是大月,在累加年的天数的基础上加上31;
case 2: //如果是二月,则还需判断用户输入的年份是平年还是闰年
if (isLeapYear) {
alldays = alldays + 29; //如果是闰年,则加上29天
} else {
alldays = alldays + 28; //平年,加上28天
}
break;
default: alldays = alldays + 30; //除了以上三种情况的所有情况,加上30
break;
}
} //到这里,总天数就累加完成了,是分为两个部分来求和的
//接下来计算用户输入的月份有多少天
switch (month) {
case 1: //用switch()分支语句来确定用户输入的月份的天数;即要显示出来的天数
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: //如果用户输入的月份是以上几个数字的话;则等会显示打印31天
monthOfDay = 31;
break;
case 2: //判断用户输入的月份所在的年是不是闰年
if (isLeapYear) {
monthOfDay = 29; //如果是闰年,待会打印29天
} else {
monthOfDay = 28; //否则,打印28天
}
break;
default: //除以上3种情况的所有情况,等会打印30天
monthOfDay = 30;
break;
}
System.out.println("\t"+year+"年"+"\t\t"+month+"月");//打印月历的标题
/*
以下代码是打印用户所输入月份的核心代码,
*/
week = alldays % 7; //计算用户输入的月份的第一天是星期几,取值范围为0-6;打印时用\t来辅助
System.out.println("一\t二\t三\t四\t五\t六\t日"); //打印月历的星期数,从星期一开始到星期天
for (int i = 1; i <= week; i++) { //满足条件,先\t,如果week=0;则不打印
System.out.print("\t");
}
for ( n = 1; n <= (7 - week); n++) { //打印月历的第一行
System.out.print(n + "\t");
}
System.out.println(); //月历第一行打印完成,换行打印第二行,光标进入第二行
for (; n <= monthOfDay; n++) { //打印后面的月历的内容
System.out.print(n + "\t");
if ((n + week) % 7 == 0) { //打印到星期日就换行,然后继续打印
System.out.println();
}
}
System.out.println();
}
}