再试条件结构
通过上次的练习,我已对单一的条件结构已经掌握纯熟,恰逢老师布置的周末作业中,有一道思考题,对条件结构知识点考究比较多,我忍不住有拿出来看看。
题目是:任意输入一个年 月 日 的日期,输出这是这一年的第几天。例如: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” 花括号,没有打。