利用java代码块功能分区调用,输出一年日历

之前是在一个主方法里面实现打印日历的整个功能,会出现一个问题,就是重复的调用了一个方法
比如判断闰年、平年的总天数,判断二月天数,判断当前月份前面月份的天数,都需要判断闰年平年,二月的天数
  *所以我们可以将这个功能分为多个操作去实现,让多个方法实现打印日历,所以我们为方法分工
  ●判断年份是否是闰年的方法(张三)
  ●计算指定月份天数的方法(李四)
  ●计算当前年除了本月,前面月份的总天数(王老五)
  ●计算1900年到当前年的前一年的所有天数(张麻子)
  ●负责打印日历的方法(打印员)
  *这几个方法都是按先后顺序,自行理解,避免重蹈覆辙

我们可以这样理解,把着几个分工分给不同的人,每个人负责不同的方法分区,这样就可以把复杂的、联系紧密的代码,进行模块化,简单化,易检错,易修改。

在分配工作之前,先了解一下我们应该定义哪些变量,

设1900年到今年初的总天数为allYearDays,

今年年初到本月月初,也就是到前一个月的总天数(假如本月是4月,那就是1,2,3月的总天数)为allMonthDays,

设今年年份是nowYear(自己输入),

本月月份是nowMonth,

本月天数是monthDays
 

①先说张三,判断年份是否是闰年,看这一年是否能被4整除但不能被100整除,或者可以被400整除,即为闰年LeapYear,否则为平年。判断的话,定义函数类型需要用到布尔类型,同时我们也可以利用三目运算符,来简化代码,代码如下:

 public static boolean isLeapYear(int nowYear){

         return (nowYear%4==0&&nowYear%100!=0)||nowYear%400==0

}

②计算指定月份的天数

李四登场,抛开其他人,李四想要计算指定月份的天数,那肯定需要知道当前月份,和当前年份,同时我们还需要判断天数,其中一三五七八十腊三十一天永不差,二月需要判断闰年平年来定天数,这时候李四自己不用算,他可以去问张三,我们调用张三就行了。代码如下:

public static int countMonthDays(int nowMonth,int nowYear){

                  if(nowMonth==1|nowMonth==3|nowMonth==5|nowMonth==7

                      

                       |nowMonth==8|nowMonth==10|nowMonth==10){

                             return 31;

                 }else if(nowMonth==2){

                        return ifLeapYear(nowYear) ? 29:28; 

                 }else{

                         return  30;

                }

}

③计算当前年除了本月,前面月份的总天数​​​​​​​(王老五)

   王老五需要知道自己在那年哪月,至于每个月有多少天,可以去问李四,这里需要注意,每次算完当前月前面所有月份的天数后,需要把allMonthDays重置为零,这样我们才能避免错乱叠加

public static int countAllMonthDays(int nowMonth,int nowYear){

           int   allMonthDays=0;

            for(int i=1;i<nowMonth;i++){

                     allMonthDays+=countMonthDays(i,int nowYear);

            }

          return allMonthDays;

}

④计算1900年到当前年的前一年的所有天数(张麻子)

张麻子在前面几位的努力下,终于可以登场了,和王老五的工作差不多,不同的是张麻子需要知道今年的年份和每一年有多少天就行了,他可以去询问张三,闰年为366天,平年为365天。同样我们每算一个月,就会调用一次循环,为了避免叠加错乱,我们需要将allYearDays重置为零

public static int countAllYearDays(int nowYear){

       for(int i=1900;i<nowYear;i++){

             allYrarDays+=isLeapYear(i) ? 366:365;

        }    

        return allYearDays;

}

⑤在前四位同志的工作下,我们计算出了1900年到我们本月一号前所有天数然后就可以算出每个月日历前面的空格数,(1900年1月1号是星期一,一星期七天,我们只需要知道1900年到本月1号之前的天数总和对七求余就行了

打印一年日历的话,我们需要知道年份就行了

public static void printCalender(int nowYear){

       int allYearDays=countAllYearDays(nowYear);

      //因为打印一年的日历allYearDays不变,为避免重复调用,可以在前面定义一下,简化运算

       for(int i=1;i<=12;i++){

                //打印月份提示符

                System.out.println("\t\t\t"+i+"月"+"\n");

              //打印星期

               System.out.println("星期一\t星期三\t星期二\t星期四\t星期五\t星期六\t星期日\n");

               //计算每个月前面的空格

                int r=(countMonthDays(i,int nowYear)+allYearDays)%7;

                 //打印空格

                 for(int j=1;j<=r;j++){

                        System.out.print("\t");

                  }

                  //打印号数

                  for(int k = 1;k<=countMonthDays(i ,nowYear);k++){

                         if((r+k)%7==0||k==(countMonthDays(i,nowYear))){

                                 System.out.println("  "+k+"\t\n");

                          }else{

                                   System.out.print("  "+k+"\t");

                          }

                   }

        }

}

⑥收尾工作,只用输入年份就行了

public static void main(String[] args){
      //打印一年的日历
       printCalender( 手动输入的);
    }

谢谢观看,详细代码如下:​​​​​​​

/**
  *之前是在一个主方法里面实现打印日历的整个功能,会出现一个问题,就是重复的调用了一个方法
  *比如判断闰年、平年的总天数,判断二月天数,判断当前月份前面月份的天数,都需要判断闰年平年,二月的天数
  *所以我们可以将这个功能分为多个操作去实现,让多个方法实现打印日历,所以我们为方法分工
  ●判断年份是否是闰年的方法
  ●计算指定月份天数的方法
  ●计算当前年前面月份所有月份的天数
  ●计算1900年到当前年的前一年的所有天数
  ●负责打印日历的方法
  *这几个方法都是按先后顺序,自行理解,避免重蹈覆辙
  */
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();
		printCalender(a);
    }
    /**
     *判断是否是闰年的方法
     *@param isLeapYear 是闰年
     *@param year 需要判断的年份
     *@return 如果是闰年返回true 否则返回false
     */
     public static boolean isLeapYear(int nowYear){
         return   (nowYear%4==0&&nowYear%100!=0)||nowYear%400==0;
     }
     /**
      *计算制定月份的天数
      *@param month 要计算的月份
      *@param  year 要计算所在月份所在的年份
      *@return 最后计算的天数
      */
     public static int countMonthDays(int nowMonth,int nowYear){
          if(nowMonth==1|nowMonth==3|nowMonth==5|nowMonth==7|nowMonth==8|nowMonth==10|nowMonth==12){
                return 31;
          }else if(nowMonth==2){
             return isLeapYear(nowYear)? 29:28;
          }else{
             return 30;
          }
     }
     /**
      *计算当年当前月前面所有月份的天数
      *@param nowMonth 当前月份
      *@param nowYear当前年份
      *@param 计算后的天数
      */
       public static int countAllMonthDays(int nowMonth,int nowYear){
            int allMonthDays=0;//关键,每算一个月的日历,为了避免累加,提前定义清零
            for(int i=1;i<nowMonth;i++){
                 allMonthDays+=countMonthDays(i,nowYear);
            }
            return allMonthDays;
       }
       /**
        *计算从1900年到当前年的前一年的所有天数
        *@param nowYear 当前年
        *@return 最后的天数
        */
        public static int countAllYearDays(int nowYear){
             int allYearDays=0;//注意易错地方,不重新赋值,会造成累加错乱
             for(int i =1900;i < nowYear; i++){
                 allYearDays+=isLeapYear(i)? 366:365;
             }
             return allYearDays;
        }
     /**
      *打印日历
      *@param nowYear 要打的年份
      */
      public static void printCalender(int nowYear){
         int allYearDays=countAllYearDays(nowYear);//避免重复调用
         for(int i=1;i<=12;i++){
              //打印月份提示符
              System.out.println("\t\t\t"+i+"月"+"\n");
              //打印星期
              System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n");
              //计算每个月一号前面的空格
              int r=(countAllMonthDays(i,nowYear)+allYearDays)%7;
              //打印空格
              for(int j=1;j<=r;j++){
                  System.out.print("\t");
              }
             //打印号数
             for (int k = 1;k <=countMonthDays(i,nowYear);k++){
                if((r+k)%7==0|k==(countMonthDays(i,nowYear))){
                   System.out.println("  "+k+"\t\n");
                }  else {
                    System.out.print("  "+k+"\t");
                }
             }
           }
      }
       
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值