接上一个日历,实用java实现输出一年的日历

      似乎这避免了重复手动输入的麻烦,所以我们直观的想法是直接加一个for循环,按照顺序直接把12个月输出,无可厚非,我们直接看效果,如图一.二

 

                                                            图一

 

                                                                 图二

       我们容易发现,单纯的输入1到12月是不行的,首先第一个问题就是,下个月该换行了,就是号数nowDay等于这个月的天数montDays的时候就要换行,所以在输出号数换行判定的地方,多添加一个条件,两张方法,一个是再添加一个if语句,另一个是在判断一行为七个数换行的里面添加或运算.

 第一种

   if(i==monthDays){

                  System.out.println("空两格"+i+"\t\n");

     }

第二种

if((i+remainder)%7==0||i==monthDays){

          System.out.println("空两格"+i+"\t\n");

}

这样每个月就会自动换行了

但是还出现一个问题,就是日历前面的空格数不对照,如下图三

                                                               图三

          我推算,可能大概率算总天数算错了,果不其然,在一步步检索中,发现我们定义allYearDays(从1900年到今年前一年的总天数);allMonthDays(从今年开始到本月前一月的总天数)的时候,定义在了输入1到12月的for循环的外面了,导致每次循环都会把上一个月的天数加上,导致错误

  现在开始纠错,我们需要什么呢?我们需要每次for循环输入一个月后,天数都是从零计算的,所以只需要在for循环输入1-12月的嵌套里面定义allYearDays(从1900年到今年前一年的总天数);allMonthDays(从今年开始到本月前一月的总天数)就行了.

        那么我们每次循环都是一个全新的开始,直接输出1-12的日历,我们需要做的是输入年份就行了.

如图四,运行成功

                                                                    图四

import java.util.Scanner;
public class Main{
     public static void main(String [] args){
     		System.out.println("请依次输入,你要打印日历的年份:");
			Scanner in=new Scanner(System.in);
			int a=in.nextInt();
 /**定义需要的日期,从而实现本月的日历打印**/
        //从1900年到今年前一年的总天数
       //从今年开始到本月前一月的总天数
         int remainder=0;//从1900年到本月前一月的总天数除以7的余数
         int nowYear=a;//今年的年份
         int nowMonth=0;//本月的月份
         int monthDays=0;//这个月的天数,需要通过判断
        /**接下来首先算日历月份1号前面有几个空格,通过1900年到本
        月前一月的天数总和除以7得到的余数得到,因为1900年1月一号是星期一**/
         /**先算1900年到本年前一年的总天数**/
         for(nowMonth=1;nowMonth<=12;nowMonth++){
               int allYearDays=0;;//从1900年到今年前一年的总天数
               for(int i=1900;i<nowYear;i++){
                   allYearDays+=(i%4==0&&i%100!=0)||i%400==0 ? 366:365;  
                     //先判断是平年还是闰年,然后再加起来,利用三目运算符 
               }
             /**然后算出今年初到本月前一月的总天数**/
               int allMonthDays=0;//从今年开始到本月前一月的总天数
               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("\n");
			   System.out.println(nowMonth+"月份:\n");
               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==monthDays){
                       System.out.println("  "+i+"\t\n");
                   }else  if((i+remainder)%7==0){              //如果加上空格是七的倍数,那输出完这个字符就换行了
                       System.out.println("  "+i+"\t\n");
                   }else{
                       System.out.print("  "+i+"\t");   //否则就直接输出
                   }
               }
           
         }
      }
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值