利用java输出一个月的日历表
首先,想要輸出一個月的日歷,就需要知道日歷的規律,從1900年1月1號是星期1,那么本月日歷一號前面有幾個空的呢(拿百度日歷來講,第一行依次星期一到星期日)?因為一星期是七天,所以(從1900年到本月1號之前天數的總和)再處以七得到的余數就等于每個月1號前面的空格數.
?
? ? ? ? ? ? ? 如下圖,這是2022.04的日歷表
? ? ? ? ? ? ? 先理清一下思路,我們把第一行的星期數輸出,那是手拿把攥的事情;
? ? ? ? ? ? ? 第二行1號前面需要隔幾天呢,我們第一段已經講了,就是1900年到前一月的天數對7求余的余數.
? ? ? ? ? ? 那接下來我們主要就需要求1900年到前一個月的天數了,我們直接求不好求,可以分為年月兩部分,那就設1900年到今年初的總天數為allYearDays,今年年初到本月月初,也就是到前一個月的總天數(假如本月是4月,那就是1,2,3月的總天數)為allMonthDays,設今年年份是nowYear(自己輸入),本月月份是nowMonth(自己輸入),本月天數是monthDays(待定,需判斷)
? ? ? ? ? ? ? 年分為閏年和平年,所以需要判斷一下,可以被4整除但不能被100整除的是閏年;還有一種是可以被400整除也是閏年.這兩個條件有一個成立就是閏年,天數就是366天,否則就是平年365,
? ? ? ? ? 可是適用for循環和條件判斷來求年allYearDays的天數:
? ? ? ? ? ? for(int i=1900;i<newYear;i++){
? ? ? ? ? ? ? ? ? ? ?if((i%4==0&&i%100!=0)||i%==400){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? allYearDays+=366;
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? allYearDays+=365;?
? ? ? ? ? ? ? ? ? }
? ????????}
這樣從1900年到前一年的總天數就算完了
但是判斷閏年平年使用if判斷有點繁瑣,我們也可以適用三目運算符,如下
? ? ? ? for(int i=1900;i<newYear;i++){
? ? ? ? ? allYearDays+=(i%4==0&&i%100!0)||i%400 ? 366:365;
????????}
同理求今年初到本月前一月的天數allMonthDays,也是兩種方法:
?for(int i=1;i<nowMonth;i++){
? ? ? ? ? if(i=1||i=3||i=5||i=7||i=8||i=10||i=12){
? ? ? ? ? ? ? ? ? ? ???allMonthDays+=31;
? ? ? ? ? ? }else if(i=2){
? ? ? ? ? ? ? ? ? ? ? if((nowYear%4==0||nowYear%100!=0)||nowYear%400==0){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? allMonthDays+=29;
? ? ? ? ? ? ? ? ? ? ?}else {
? ? ? ? ? ? ? ? ? ? ? ? ? allMonthDays+=28
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? allMonthDays+=30;
? ? ? ? ? ? }
}
第二種算也是利用三目運算符
?for(int i=1;i<nowMonth;i++){
? ? ? ? ?if(i==1||i=3||i=5||i=7||i=8||i=10||i=12){
? ? ? ? ? ? ? ?allMonthDays+=31;
? ? ? ? ? }else if(i=2){
? ? ? ? ? ? ? ? ? allMonthDays+=(nowYear%4==0||nowYear%100!=0)||nowYear%400==0 ? 29:28;
? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? allMonthDays+=30;
? ? ? ? ?}
}
成功的開端是勝利的一半,上面我們算出了從1900年到今年前一年的總天數allYearDays和今年初到本月前一月的總天數allMonthDays,那就可以算余數了,設余數為remainder,
? ? ?remainder=(allYearDays+allMonDays)%7;
接下來準備工作做好了,該輸出第一行的星期了
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n");
接下來輸出這個月的天數,那輸出之前我們需要判斷一下這個月有幾天,利用if語句,同樣是兩種方法:
? ? ? ? ? ? if(nowMonth==1||nowMonth==3||nowMonth==5||nowMonth==7||nowMonth==8||nowMonth==10||nowMonth==12){
? ? ? ? ? monthDays=31;
}else if(nowMonth==2){
? ? ? ?if((nowYear%4==0||nowYear%100!=0)||nowYear%400==0){
? ? ? ? ? ? monthDays=29;
? ? ? ?}else{
? ? ? ? ? ? ? ?monthDays=28
? ? ? ?}
}else{
? ? ? ? ? ? ?monthDays=30;
? ? ? ? }
第二種:
if(nowMonth==1||nowMonth==3||nowMonth==5||nowMonth==7||nowMonth==8||nowMonth==10||nowMonth==12){
? ? ? ? ? monthDays=31;
}else if(nowMonth==2){
? ? ? ? ?monthDays=(nowYear%4==0||nowYear%100!=0)||nowYear%400==0 ? 29:28;
}else{
? ? ? ? ? ?monthDays=30;
? }
接下來就是輸出了,第一行已經輸出了,所以先輸出第二行的空格,
? ? ? ?for(int i=1;i<=remainder;i++){
? ? ? ? ? ? ?System.out.println("\t");
? ? ? }
然后輸出本月的日期,注意每一行到七個數就需要換行,就是空格數加上號數是七的倍數就得換行
空格數就是我們上面求的余數remainder
for(int i=1;i<=monthDays;i++){
? ? ? ? if((i+remainder)%7==0){
? ? ? ? ? ? ? System.out.println(" 打兩個空格?"+i+"\t\n");
? ? ? ? }else {
? ? ? ? ? ? ? System.out.print("? 打兩個空格"+i+"\t");
? ? ? ? }
}
接下來就完成了,需要注意的是,小編條件有限,只能手動修改nowYear和nowMonth
?
import java.util.Scanner; public class Test{public static void main(String [] args){System.out.println("請依次輸入,你要打印的年份和月份:");Scanner in=new Scanner(System.in);int a=in.nextInt();int b=in.nextInt();/**定義需要的日期,從而實現本月的日歷打印**/int allYearDays=0;//從1900年到今年前一年的總天數int allMonthDays=0;//從今年開始到本月前一月的總天數int remainder=0;//從1900年到本月前一月的總天數除以7的余數int nowYear=a;//今年的年份int nowMonth=b;//本月的月份int monthDays=0;//這個月的天數,需要通過判斷/**接下來首先算日歷月份1號前面有幾個空格,通過1900年到本月前一月的天數總和除以7得到的余數得到,因為1900年1月一號是星期一**//**先算1900年到本年前一年的總天數**/for(int i=1900;i<nowYear;i++){allYearDays+=(i%4==0&&i%100!=0)||i%400==0 ? 366:365; //先判斷是平年還是閏年,然后再加起來,利用三目運算符 }/**然后算出今年初到本月前一月的總天數**/for(int i=1;i<nowMonth;i++){if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){allMonthDays+=31;}else if(i==2){allMonthDays+=(nowYear%4==0&&nowYear%100!=0)||nowYear%400==0 ? 29:28;//判斷平年還是閏年的二月}else {allMonthDays+=30;}}/**現在總天數算完了,該算每個月前面的空格數了,就等于總天數除以7的余數**/remainder=(allYearDays+allMonthDays)%7;/**接下來先輸出每個月份上面的星期數,注意每個漢字是一個字符,一個制表符占四個字符位置需要對應**/System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n");/**下面就開始輸入一號前面的空格了**/for(int i=1;i<=remainder;i++){System.out.print("\t");}/**接下來開始輸入日期,每七個換一個行.但是還需要判斷一下本月有幾天**/if(nowMonth==1||nowMonth==3||nowMonth==5||nowMonth==7||nowMonth==8||nowMonth==10||nowMonth==12){monthDays=31;}else if(nowMonth==2){monthDays=(nowYear%4==0&&nowYear%100!=0)||nowYear%400==0 ? 29:28;}else {monthDays=30;}/**下面不賣關子了,開始輸出月份的號,同時需要判斷到一行七個數,需要ヾ(@^▽^@)ノ換行,需要注意可以添加一些空格使號和星期對齊*/for(int i=1;i<=monthDays;i++){if((i+remainder)%7==0){ //如果加上空格是七的倍數,那輸出完這個字符就換行了System.out.println(" "+i+"\t\n");}else{System.out.print(" "+i+"\t"); //否則就直接輸出}}} }總結
以上是生活随笔為你收集整理的利用java输出一个月的日历表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飘过的紫蝴蝶
- 下一篇: Spark 常用算子详解(转换算子、行动