题目: 中国有句俗语叫“三天打鱼两天晒网”。如果从1990年1月1日起开始执行“三天打鱼两天晒网”。如何判断在以后的某一天中是“打鱼”还是“晒网”?(年,月,日是输入的.) 要求:不要求使用if做。 //开始之前,我先来扯会犊子,说实话,我刚看到这道题时,是一脸懵圈的状态,毫无思路,不知该从哪里下手。于是昨晚也没有发。于是,今天在老师的思路引导下,开始撸出来。(我这是一种不可取状态,搞代码一定不能让别人提供思路,不然你就失去了此题的意义。主要我太菜了)下面言归正传: 老规矩:上思路分析。 摈弃着:化烦为简,先死后活的思想 //1.数据先给做死:首先判断从1990年到当前日期的天数,例如今天是2020年6月30日。 //2.先统计年的天数(不能包括本年)比如2020年,若统计到当年的话,那么表示当年已经过完,因此需要统计的是本年的上一年。 //3.统计月的天数(不包括本月)道理同上。 //4.统计总天数。 //5.最后求出打渔还是晒网。 对年份的天数统计: 首先用一个循环来遍历1990到2020的上一年的天数,定义一个变量sum来接受总天数。注意:当你遍历年份的时候,千万别忘记了闰年的平年,平年365天,闰年366天。
int sum=0; for(int i=1990;i<2020;i++){ if(i%4==0 && i % 100!=0 || i%400==0){ sum=sum+365;//闰年 } else{ sum=sum+365;//平年 } }//循环结束表明,统计到了从1990到2020的所有天数。接着开始统计月份的天数:(在统计月数的天数时也不能忽略了2月这个特殊的月份,因为润年29天,平年28天。) 那么如何统计月份的天数呢,这里有个很好用的方法。就是用switch…case…来做。(利用case的穿透原则)如果有小伙伴不晓得的,接下来的某一天我会再发一篇switch…case的使用方法和注意细节。鄙人觉得一个for循环+switch用的场合非常多,并且很好使。 下面来看
for(int j=0;j<12;j++){ switch(i){ case 1: case 3: case 5: case 7: case 9: case 12://当然12月是进不来的 sum=sum+31; case 2: if(year%4==0 && year % 100!=0 || year%400==0){ sum=sum+29; }//闰年29天 else{ sum=sum+28; } default: sum=sum+30; } } //循环结束完后已经统计到了2020年6月以前的所有天数了。接着此题的核心代码基本走完了。 定义一个变量来接收总天数 int totalday=sum+day; 自此所有天数已经求出。 下面来进行判断来求出打渔还是晒网。 用totalday%5取余,若余数是1,2,3,这三天则表明是打渔,4,0这两天来表明是晒网。我在这里解释一下为啥是这样,比如我天数取个1 则对5取余是1,2余数是2,3余数3,4余数是4,5余数是0. 当然也可以用if来判断,我在这里主要想加深一下switch的用法,因此选择switch做。
switch(totalday%5){ case 1: case 2: case 3: System.out.println("打渔"); break; case 4: case 0: System.out.println("晒网"); }分析完毕:年月日可以再定义一个扫描器类,动态输入,但是我没写了,就放的死数据。2020,6,30 //完整代码如下:
public class HomeworkTest2 { /** 思路分析: 1.先将统计1990到当前年(不包括本年)的天数 2.在统计当前月(不包括本月的天数); 3.统计当前月的天数 4.将所有天数进行累加 5.求出打渔还是晒网 */ public static void main(String[] args) { int year=2020; int month=6; int day=30; int sum=0; int totalday=0; //先统计年的天数 for(int i=1990;i<year;i++){ if(i%4==0 && i % 100!=0 || i%400==0){ sum=sum+366; } else{ sum=sum+365; } }//循环结束后 将得到从1990年到上一年2019年的所有天数 //统计月的天数 for(int i=0;i<month;i++){ switch(i){ case 1: case 3: case 5: case 7: case 9: case 12://当然12月进不来 sum=sum+31; case 2: if(year%4==0 && year % 100!=0 || year%400==0){ sum=sum+29; } else{ sum=sum+28; } default: sum=sum+30; } }//当循环结束后,从1月到当前月的前一个月的天数全部求出 totalday=sum+day; switch(totalday%5){ case 1: case 2: case 3: System.out.println("打渔"); break; case 0: case 4: System.out.println("晒网"); } } }截图: