简单日历的实现思路
目录:
- 功能的描述与介绍。
- 分步对代码进行解析
- 完整代码以及样例输出的呈现
1.相关功能描述
在控制台上按提示输入要查询的年分,
输入完成后,按下回车键即可在控制台显示出本年的日历表。
2.分部对代码进行分析
-
首先:总体思路 获取输入年分—>判断并计算出本年每个月的天数—>计算出每个月第一天在本年的第几天—>显示日历
-
思路的分步以及代码介绍
(1).获取输入
public void getDate() {
System.out.println("请你输入要查询年份的日历表:");
this.year = in.nextInt();
}
(2).计算输入年分每个月份的天数
用公式 year % 4 == 0 && year % 100 != 0 || year % 400 == 0判断输入年分是平年还是闰年:闰年二月有29天,平年有28天。
public int reDays(int month) {
int days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
days = 29;
} else {
days = 28;
}
break;
}
return days;
}
(3).计算输入年分的第一天在本年中属于第几天,并由此计算出第一天的星期数
-
本段代码中int 型变量用于记录每个月份的第一天为输入年份中的第几天。
-
变量allDays初始化为1则是因为for循环语句块在执行过程中未能计算出一月份为本年中第一天
则为后续计算方便规定allDays初始值为1;
-
某月分前所有天数总和+1的值即为该月份的第一天在输入年分的天数
-
根据公式((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7计算出某一月份第一天的星期数
public int getMonthFirst(int month) {
int alldays = 1;
for (int i = 0; i < month; i++) {
alldays += reDays(i);
}
return ((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7;
}
(4).完成日历的输出工作:
-
完成日历表头的输出
查阅资料知悉日历表的样式:三行四列。
用字符串数组存储每个月份的中文字符总共十二个。
String[] str = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
根据日历表的样式:输出表头,并根据需要调整日历表表头的位置,使其更为美观。
```java
System.out.println("\t\t\t\t\t\t\t\t2020年\n");
for (int i = 0; i < str.length; i++) {
if (i < 10) {
System.out.printf("\t\t%s 月\t\t", str[i]);
} else {
System.out.printf("\t\t%s月\t\t", str[i]);
}
if ((i + 1) % 4 == 0) {
System.out.println();
for (int j = 1; j <= 4; j++) {
System.out.print("\t一 二 三 四 五 六 日");
}
System.out.println()
}
```
跟据日历样式,每个月份天数的高度最多占六行,为保证所有日期正常输出,则选取最高行数:六行。
每行输出四个月份的日历。
随后根据 需要的定义成员变量 count 初始值为0
```java
int[] num = { 0, 0, 0, 0 }; //用于辅助日期的输出
System.out.println("\t\t\t\t\t\t\t\t2020年\n");
for (int i = 0; i < str.length; i++) {
if (i < 10) {
System.out.printf("\t\t%s 月\t\t", str[i]);
} else {
System.out.printf("\t\t%s月\t\t", str[i]);
}
if ((i + 1) % 4 == 0) { // 判断是否到达四月份的整数倍
System.out.println();
for (int j = 1; j <= 4; j++) {
System.out.print("\t一 二 三 四 五 六 日");
}
System.out.println();
for (int j = 1; j <= 6; j++) { //每个月份天数的高度最多占六行
for (int s = 1 + (count * 4); s <= (4 + count * 4); s++) {//每行四个月份
System.out.print("\t");
if (j == 1) { //每一个月份第一行的日期根据距离制表符末尾的空格数确定所处星期位置
for (int k = 1; k <= (getMonthFirst(s) != 0 ? (getMonthFirst(s) - 1) : 6); k++) {
System.out.print(" ");
}
}
for (int m = 1+ num[(s - 1) % 4]; m <= 42/* reDays(s) */; m++) {
if (m <= reDays(s)) { //使每个月份的日期输出,满六行,不足的部分用空格代替
if (m < 10)
System.out.printf("0%d ", m);
else
System.out.printf("%d ", m);
} else {
System.out.print(" ");
}
num[(s - 1) % 4]++;
if ((getMonthFirst(s) + m - 1) % 7 == 0) { //每个月份输出一行结束后换行
break;
}
}
}
System.out.println();
}
count += 1; // if ((i + 1) % 4 == 0) count自增
} //1循环,for (int s = 1 + (count * 4); s //<= (4 + count * 4); s++)进入下一行的月份进行输出
for (int j = 0; j < num.length; j++) { //输出完一行月份的日历后,数组的每个元素
num[j] = 0; //便于下一行月份日历的输出
}
}
}
```
3.完整代码以及样例输出的呈现
完整代码
import java.util.Scanner;
public class Calender2 {
Scanner in = new Scanner(System.in);
String[] str = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二" };
private int year;
private int count;
public Calender2() {
getDate();
}
public void getDate() {
System.out.println("请你输入要查询年份的日历表:");
this.year = in.nextInt();
}
public int reDays(int month) {
int days = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
days = 29;
} else {
days = 28;
}
break;
}
return days;
}
public int getMonthFirst(int month) {
int alldays = 1;
for (int i = 0; i < month; i++) {
alldays += reDays(i);
}
return ((year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + alldays) % 7;
}
public void show() {
int[] num = { 0, 0, 0, 0 };
System.out.println("\t\t\t\t\t\t\t\t2020年\n");
for (int i = 0; i < str.length; i++) {
if (i < 10) {
System.out.printf("\t\t%s 月\t\t", str[i]);
} else {
System.out.printf("\t\t%s月\t\t", str[i]);
}
if ((i + 1) % 4 == 0) {
System.out.println();
for (int j = 1; j <= 4; j++) {
System.out.print("\t一 二 三 四 五 六 日");
}
System.out.println();
for (int j = 1; j <= 6; j++) {
for (int s = 1 + (count * 4); s <= (4 + count * 4); s++) {
System.out.print("\t");
if (j == 1) {
for (int k = 1; k <= (getMonthFirst(s) != 0 ? (getMonthFirst(s) - 1) : 6); k++) {
System.out.print(" ");
}
}
for (int m = 1+ num[(s - 1) % 4]; m <= 42/* reDays(s) */; m++) {
if (m <= reDays(s)) {
if (m < 10)
System.out.printf("0%d ", m);
else
System.out.printf("%d ", m);
} else {
System.out.print(" ");
}
num[(s - 1) % 4]++;
if ((getMonthFirst(s) + m - 1) % 7 == 0) {
break;
}
}
}
System.out.println();
}
count += 1;
}
for (int j = 0; j < num.length; j++) {
num[j] = 0;
}
}
}
public static void main(String[] args) {
Calender2 c = new Calender2();
c.show();
}
}
显示输出样例