今天刚学习Java循环,选择等等知识点。为了练习这些知识点同时培养代码思维,使用一个纯Java代码来实现我们在选择相关年月后就输出相应的月份日历。
以下是未封装的代码:
// 思考得到 我只要知道每个月的前面有几个空格和这个月的天数,我就能得出准确的日期表
// 而每个前面的空格数是由从1900年到所选日期的总天数模七决定的。
// (这里是因为1900年1月1日是星期一)
// 这个月的天数需要考虑的是月份,是不是闰月,闰年这些情况
public static void main(String[] args) {
// 定义几个变量 月份前面的space空格数、mouth月份、year年份、totalDay总天数、monthDays该月的天数
int space = 0;
int mouth = 1;
int year = 2000;
int totalDay = 0;
int monthDays = 0;
// 获得从1900年开始到前一年为止的总天数
for (int i = 1900; i < year; i++) {
// 这个时候又发现了新的问题,我需要知道在年份范围内有多少个闰年才能算出到年份的前一年为止的总天数
if(i%4==0&&i%100!=0||i%400==0) {
totalDay+=366;
}else {
totalDay+=365;
}
}
System.out.println(totalDay);
// 通过判断得到前一年为止的总天数,这时候我们发现,还需要加上我们设定的月份之前的月份的总天数才可以
// 这里我们通过一个switch判断语句来获得准确的那个月份的天数,再通过一个for循环来得到总月份的天数
for (int i = 1; i < mouth; i++) {
switch (i) {
// 这里是列出来所有大月份的情况
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
totalDay += 31;
break;
// 二月这里还要再次判断是否是闰年的二月
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
totalDay += 29;
} else {
totalDay += 28;
}
break;
// 其他情况就是30天
default:
totalDay += 30;
break;
}
}
// 这个时候得到了总天数,总天数%7就可以得到所所需的月份前的空格数
space = totalDay % 7;
// 我们现在得到了所需月份前面的空格数,现在想要的是此月份的天数
// 还是可以使用switch和for循环
switch (mouth) {
// 这里是列出来所有大月份的情况
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthDays = 31;
break;
// 二月这里还要再次判断是否是闰年的二月
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
monthDays = 29;
} else {
monthDays = 28;
}
break;
// 其他情况就是30天
default:
monthDays = 30;
break;
}
// 在打印月份这之前我们需要打印一下星期
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日");
System.out.println("====================================================");
// 这里还需要引入一个名为count的计数器概念,如果count%7=0那么就要换行
int count = 0;
for (int i = 0; i < space; i++) {
count++;
System.out.print("\t");
}
for (int i = 1; i <= monthDays; i++) {
count++;
System.out.print(i + "\t");
if (count % 7 == 0) {
count = 0;
// 换行
System.out.println();
}
}
}
以下是将方法封装后变得简洁的代码:
public static void main(String[] args) {
// 调用实现函数
show();
}
// 指定的日历年份
public static int year = 1999;
// 指定的日历月份
public static int month = 1;
// 获得总天数
public static int getDaysFrom1900() {
int days = 0;
// 获取从1900年到指定日历年份的前一年的天数
for (int i = 1900; i < year; i++) {
days += wYear(i) ? 366 : 365;
}
// 获取从一月到指定日历月份的前一个月的天数
for (int i = 1; i < month; i++) {
days += getDaysFromMonth(i);
}
return days;
}
// 获取指定月份的天数
private static int getDaysFromMonth(int month) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
return wYear(year) ? 29 : 28;
default:
return 30;
}
}
// 判断指定年份是平年还是闰年
private static boolean wYear(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
// 显示日历方法
public static void show() {
// 获取从1900年到指定月份前一个月的总天数
int totalDays = getDaysFrom1900();
// 获取指定月份的天数
int daysOfMonth = getDaysFromMonth(month);
// 获取指定月份第一天前面的空格数
int space = totalDays % 7;
// 计数器
int count = 0;
// 显示
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日");
System.out.println("====================================================");
for (int i = 0; i < space; i++) {
count++;
System.out.print("\t");
}
for (int i = 1; i < (space + daysOfMonth); i++) {
count++;
System.out.print(i + "\t");
if (count % 7 == 0) {
count = 0;
// 换行
System.out.println();
}
}
}