已知(隻有一個已知條件):
- 1900年1月1号是星期一
實作的功能:
- 通過本條件來寫一個輸入相應的年份和月份就可以在控制台輸出相應月份月曆
基本的思路:
- 已知1900年的1月1日是周一,要輸出這個月的月曆首先最需要知道的就是本月1号是周幾,這樣我們才可以排列出來這個月的月曆第一天的位置
本月1号距離1900年1月1号多少天設為days,這個天數對7取餘數就可以求出本月1号是周幾 0周一 | 1周二 | 2周三 |3 周四 | 4周五 | 5周六 | 6周日 天數 = (輸入的年份 - 1900)* 365 (如果是閏年在加一天) 閏年的判斷條件(可以被4整除但是不能被100整除的 或者 是可以被400整除的年份)
- 第二點就是要知道這個月有多少天
本月的天數就是從1月份到12月份判斷(中間要注意平年和閏年的2月份不一樣,加一個條件判斷)
- 第三點就是每次要在周六的日期輸出之後換到下一行(以周日為每周的第一天的情況)
判斷日期為周幾的方法和判斷1号的方法是一樣的,為了友善可以直接在本月1号的時間上加上今天的日期減一就可以知道今天的時間 距離1900年1月1号的時間差,對7取餘就知道是周幾了
下面是個人寫的代碼:
public class WanNianLi {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 歡迎界面
System.out.println("*************************");
System.out.println("******** 萬年曆 *********");
System.out.println("*************************");
System.out.print("請輸入年份:");
// 年份
int year = input.nextInt();
System.out.print("請輸入月份:");
// 月份
int month = input.nextInt();
boolean isRun = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
/**
* 目前月份的月1日距離1900 年的1月1日多少日
*/
int dates = 0;
for (int i = 1900; i < year; i++) {
dates += 365;
//判斷是不是閏年,如果是閏年就在dates的基礎上+1天
if ((i % 4 == 0 && i % 100 != 00) || (i % 400 == 0)) {
dates += 1;
}
// System.out.println(i + "年:" + dates);
}
// System.out.println(dates);
// 1、3、5、7、8、10月份加31天,3、6、9、11月加30天,平年2月加28,閏年2月加29天
for (int i = 1; i < month; i++) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
dates += 31;
break;
case 4:
case 6:
case 9:
case 11:
dates += 30;
break;
case 2:
if (isRun) {
dates += 29;
} else {
dates += 28;
}
break;
}
}
// System.out.println(dates);
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
/**
* 1号需要空幾個制表符
*/
int week = dates % 7;
switch (week) {
case 0:
System.out.print("\t");// 周一
break;
case 1:
System.out.print("\t\t");// 周二
break;
case 2:
System.out.print("\t\t\t");// 周三
break;
case 3:
System.out.print("\t\t\t\t");// 周四
break;
case 4:
System.out.print("\t\t\t\t\t");// 周五
break;
case 5:
System.out.print("\t\t\t\t\t\t");// 周六
break;
default:
break;
}
/**
* 選擇輸出的這個月的天數
*/
int days = 31;
switch (month) {
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if (isRun) {
days = 29;
} else {
days = 28;
}
break;
}
/**
* 循環輸出本月的每一天,判斷如果是周六就換行
*/
for (int i = 1; i <= days; i++) {
System.out.print(i + "\t");
if ((dates + i - 1) % 7 == 5) {
System.out.println();
}
}
}
}
結果示範: