撰寫日歷
列印一個月份的日歷的難點在于得找準這個月的第一天所對應的星期數,要想解決這個問題有一個好方法就是找出一年一月一號對應的是星期一,這樣所求月份的第一天星期數=(這一年至所輸年份間的總天數+所輸年份的1月至所輸月份間的總天數+1)%7,那我找的這一年呢就是1900年,別問我為什么能找到,問就是老師教的,
```package Day_03;
import java.util.Scanner;
public class Calendar {
public static void main(String[] args) {
//輸入年份以及月份
//計算1900年至所輸年份間的總天數
//判斷平年閏年
Scanner scanner=new Scanner(System.in);
System.out.println("輸入一個年份:");
int year=scanner.nextInt();
int yearTotalDays = 0;
for(int i=1900;i<year;i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
yearTotalDays += 366;
} else {
yearTotalDays += 365;
}
}
//計算所輸年份的一月至所輸月份間的總天數
System.out.println("輸入一個月份:");
int month=scanner.nextInt();
int monthTotalDays=0;
int days=0;
for(int m=1;m<=month;m++){ //這里的m要取等號并不是計算的時候要用到,而是下面列印所輸月份時避免再次考慮該月份有多少天
//判斷每個月的天數(大月、小月、二月(還要判斷是平年還是閏年))
switch(m){
case 2:
//判斷所輸的年份是否是閏年
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
days = 29;
}else{
days = 28;
}
break;
//小月
case 4:
case 6:
case 9:
case 11:
days=30;
break;
//大月
default:
days=31;
}
//累加每個月的總天數
if(m<month){
monthTotalDays+=days;
}
}
//計算所輸月份第一天的星期數
int week=(yearTotalDays+monthTotalDays+1)%7;
//因為星期天的值是0,為了控制一號列印的位置,需將星期日設為7
if(week==0){
week=7;
}
System.out.println("一\t二\t三\t四\t五\t六\t七");
//控制列印的間距
for(int b=1;b<week;b++){
System.out.print("\t");
}
//列印當月的每一天
for(int d=1;d<=days;d++) {
System.out.print(d+"\t");
//判斷每一天是否是星期天
if ((yearTotalDays + monthTotalDays + d) % 7 == 0) {
//換行
System.out.println();
}
}
}
}

總結自己犯的錯誤:
1.我犯的第一個錯誤呢就是在計算跨年的天數的時候,if的條件本應該是判斷1900年至所輸年份之間年份的平年還是閏年,我卻判斷成了所輸年份是平年還是閏年,
2.第二個問題是計算所輸年份的一月至所輸月份之間的總天數,其實這里也還好,就是二月的時候要判斷一下所輸年份是平年還是閏年,然后把從1月到所輸月份之間的天數加起來,麻煩的是在列印所輸月份的日歷時還需要次再判斷該月的天數,老師給出了優化方法,就是在計算所輸年份的一月至所輸月份之間的總天數時將所輸入的月份也包含進去,但是計算天數的時候只計算一月至所輸月份之間的總天數,在switch陳述句中用宣告的變數days存盤最后一個月的天數,這個天數也就所輸入的天數,
3.第三個難題是格式問題,找準了1號所對應的星期數,那么怎么將他們對齊呢?首先將第一排的星期數列印好,每個星期數之間用\t隔開;再用一個回圈陳述句,在1號所對應的星期數前面輸入\t,例如該月份的1號對應星期三,那么當i<3,也即在i=1和i=2時需要輸入\t,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236570.html
標籤:java
上一篇:【上岸經驗】3年作業經驗的我終于成功上岸了,4年成功拿到美團開發崗offer,特來分享我的經驗幫助大家!
下一篇:問題排查之JVM記憶體泄漏
