首页 > 代码库 > 再试条件结构

再试条件结构

 

通过上次的练习,我已对单一的条件结构已经掌握纯熟,恰逢老师布置的周末作业中,有一道思考题,对条件结构知识点考究比较多,我忍不住有拿出来看看。

题目是:任意输入一个年 月 日 的日期,输出这是这一年的第几天。例如:1月1日 是这年的第1天,12月31日,是这年的365天或则是366天(因为有闰年会多一天)

public class L4月27日思考题{
 public static void main(String[]agrs){
  int a=Integer.parseInt(agrs[0]) ;
  int b=Integer.parseInt(agrs[1]) ;
  int c=Integer.parseInt(agrs[2]) ;
  int d=0;
  if(c<=31){
  if(a%100==0){
   if(a%400==0){  //这是闰年
   //d=闰年的方法;
    switch(b){
     case 1:
 d=c;
     break;
     case 2:
 d=c+31;
     break;
     case 3:
 d=c+31+29;
     break; 
     case 4:
 d=c+31+29+31;
     break; 
     case 5:
d=c+31+29+31+30;
     break; 
     case 6:
 d=c+31+29+31+30+31;
     break; 
     case 7:
d=c+31+29+31+30+31+30;
     break;  
     case 8:
d=c+31+29+31+30+31+30+31;
     break; 
     case 9:
d=c+31+29+31+30+31+30+31+31;
     break; 
     case 10:
 d=c+31+29+31+30+31+30+31+31+30;
     break; 
     case 11:
d=c+31+29+31+30+31+30+31+31+30+31;
     break; 
     case 12:
d=c+31+29+31+30+31+30+31+31+30+31+30;
     break;
     default:
     System.out.println("无效的日期"); 
      }    
   }else{   //这是整百的平年
   //d=平年的方法;
     switch(b){
     case 1:
d=c;
     break;
     case 2:
d=c+31;
     break;
     case 3:
d=c+31+28;
     break; 
     case 4:
d=c+31+28+31;
     break; 
     case 5:
d=c+31+28+31+30;
     break; 
     case 6:
d=c+31+28+31+30+31;
     break; 
     case 7:
 d=c+31+28+31+30+31+30;
     break;  
     case 8:
d=c+31+28+31+30+31+30+31;
     break; 
     case 9:
d=c+31+28+31+30+31+30+31+31;
     break; 
     case 10:
d=c+31+28+31+30+31+30+31+31+30;
     break; 
     case 11:
d=c+31+28+31+30+31+30+31+31+30+31;
     break; 
     case 12:
d=c+31+28+31+30+31+30+31+31+30+31+30;
     break;
     default:
     System.out.println("无效的日期"); }
  }
  }else{if(a%4==0){    //这是闰年"
      //d=闰年的方法;
     switch(b){
     case 1:
d=c;
     break;
     case 2:
d=c+31;
     break;
     case 3:
d=c+31+29;
     break; 
     case 4:
d=c+31+29+31;
     break; 
     case 5:
d=c+31+29+31+30;
     break; 
     case 6:
d=c+31+29+31+30+31;
     break; 
     case 7:
d=c+31+29+31+30+31+30;
     break;  
     case 8:
d=c+31+29+31+30+31+30+31;
     break; 
     case 9:
d=c+31+29+31+30+31+30+31+31;
     break; 
     case 10:
d=c+31+29+31+30+31+30+31+31+30;
     break; 
     case 11:
d=c+31+29+31+30+31+30+31+31+30+31;
     break; 
     case 12:
d=c+31+29+31+30+31+30+31+31+30+31+30;
     break; 
     default:
     System.out.println("无效的日期");  }
   }else{   //这是不整百的平年
       //d=平年的方法;
     switch(b){
     case 1:
d=c;
     break;
     case 2:
d=c+31;
     break;
     case 3:
d=c+31+28;
     break;
     case 4:
d=c+31+28+31;
     break; 
     case 5:
d=c+31+28+31+30;
     break; 
     case 6:
d=c+31+28+31+30+31;
     break; 
     case 7:
d=c+31+28+31+30+31+30;
     break;  
     case 8:
d=c+31+28+31+30+31+30+31;
     break; 
     case 9:
d=c+31+28+31+30+31+30+31+31;
     break; 
     case 10:
d=c+31+28+31+30+31+30+31+31+30;
     break; 
     case 11:
d=c+31+28+31+30+31+30+31+31+30+31;
     break; 
     case 12:
d=c+31+28+31+30+31+30+31+31+30+31+30;
     break;
     default:
     System.out.println("无效的日期");}

}

  

} }else{
 System.out.println("无效的日期");}

  System.out.println("这是这一年的第"+d+"天");

 
 }
}

    其实看到这道题,思路是很清晰的,判定闰年还是非闰年,闰年一种方法,非闰年一种方法,用IF分开else分开,审题不到3分钟我就开始写题。

    直到写到中间我才发现,我审题的时间确实太短了,因为这道题按照我想的来看确实很复杂,因为判别闰年是有2种不同的方法的,加上闰年和平年的不同算法,就会出现2*2次运算,这大大加长了代码的长短,越长的代码越容易错。其实如果仔细审题还是可以发现的,其实闰年的2月到12月就比平年多1天,2月拿出来单独处理,剩下的就只判断是闰年就+1天,是平年就少1天。

    而且直到现在我才发现自己又多了1个错误,2月是个特殊的月份,他的日子不能超过29日,我却忘记特殊限制了,看来这道题确实不如我想的简单啊,怕是有要改动了。

    现讨论下我已有的,还有瑕疵的代码,

    这道题,从开始就就明确了,需要输入,年月日,所以很自然的会想到键入3个整数型的数,年份是没有限制的,月份有限制,日期有限制,所以,键入  int a=Integer.parseInt(agrs[0]) ;  int b=Integer.parseInt(agrs[1]) ;  int c=Integer.parseInt(agrs[2]) ;  这里要强调,英文的准确性,我因为单词大错,大小写问题,出了几百个错误,检查了10多20分钟才检查出来,这应该多小心,多仔细,一句话,多打几次,打熟悉了看熟悉了就不会错了。继续,把天数d拿出来,然后开始写运算关系,这里又要强调,这次我写代码发现,如果仅仅写int d,不赋值,靠if,switch里面的表达式赋值,会报错,变量d,没有初始化,所以以后如非赋值会导致结果错乱,否则还是先赋值,特别是遇到条件,如果不满足的话,直接拉下来,没赋值肯定会报错。

    搭建大纲,逻辑关系,1,按照我的思路,首先判别a,闰年与否,所以直接带入if,else, 因为2种判别方法,所以就用if,写一种,else写一种,逻辑上就是,(if)如果这个年份能被100整除,能被400整除,(else)如果不能100整除 能被4整除, 这就是我的思路,于是就有了 if  里面添1个 if else,else里面添加1个if,else,代码上完全没有问题,

        在关键位置上标明 //该年是闰年,//该年是平年,先把大纲描绘出来。花括号打好,免得后面代码多了,难看。

  然后大纲搭建好了以后,现在是开始认真的运算,标注了4处,平年的算法和闰年的算法,其实平年的算法和闰年算法真的大同小异,基本上一样,都是前面的日子加起来,关键是,其中有1个日子是可变的,所以,为了这个可变的情况,把所有的月份全部摊开,使用switch的语句,采用12个方案,1月-12月的方法 全部写出来,套用方案,自然就能回避2月可变的情况。

  总结出错的地方,switch,在现阶段我还是第一次用,出错概率真心有点大,case后必须空格接Int的数字,此错误检查时间10分钟,case后数字,可以是int,可以是char,char加"",但是int可以不用加,我不小心加了,一直报错未检查出来,此问题检查了10分钟。case后,必须接default,否则出错,此问题2分钟。花括号,此问题让我检查了20多分钟,才确定好了所有的花括号,养好打花括号的好习惯,能节约好多写代码的时间。

  总结java命令,常出现的错误提示,“进行语法解释时,已到达文件结尾”,这是缺少花括号}

                                       “java不兼容的类型”,switch语句中表达式的类型必须是兼容的基本类型,打了引号以后 就被识别为chai。

                  “java需要为case、default”,switch语句中,必须case后加default。

                  “java 需要class,interface或enum” 花括号,没有打。