相信学习编程的朋友,学到循环的时候肯定都会遇到这个问题
有的可能不会遇到,但是不要担心,因为你看我写的时候就已经遇到了
首先,既然要判断这是第几年的第几天
我们首先想到的肯定是先判断当前的月份为几对不对?
当然你要是说你一下就想到要分闰年和平年那就说明你思维很灵活,有未雨绸缪之心
那言归正传,一年十二个月,我们肯定先想到switch啊,为什么呢?
因为switch是单选啊对不对,而且switch有一个让我们特别喜欢的机制啊
那就是如果不加break的时候,一个case成立了,剩下的case依次执行直到遇到break才停止啊
你看多好,那我们的程序框架是不是就可以写成如图所示了
(注:定义年份为year 月份为month 日期为 day 将要输出的第几天为 today)
那为什么是从大到小排序呢?
答案当然就是因为我们想要的效果是判断月份之后,把比它小的所有月份的天数相加,
如果反过来的话达不到我们想要的效果,当然不相信的朋友也可以去尝试一下,看看会是什么效果
那剩下的是不是就是看看我们应该怎么相加了对吧
假设咱输入的月份为当年的 1 月,那today是不是就是我们的day啊
那case 1:里面就可以写 today = today + day;
再次假设咱们输入的月份为2 ,那today是不是就是我们1月的天数再加上我们的day啊
所以case 2:里面是不是就是 today = today + 31+day;
那刚才说道我们switch的机制就是:如果一个case里边不加break就会执行当前case和后边所有case里的内容,直到遇到break为止对不对
那么我们的case 2:里面是不是就可以直接写today = today + 31啊,执行完case 2:接着执行case 1:得到today = today + 31 +day;的效果
相信可以看出来我们case:里面加的是我们上一个月的天数对不对
那么接下来我们就应该假设我们输入的是3月了对不对
你看这就遇到开始说到的闰年和平年的问题了对不对,要不然怎么会说是未雨绸缪呢
那么闰年和平年的区别不就是年份能被4整除但是不能被100整除,或者能被400整除的年份为闰年,反之则不是
那么写出来就如下
因为根据上边判断case 3:里面加的是2月的天数所以我们应该把这个代码写在3月里边
依次类推我们剩下的case里边内容也就写出来了,接下来是整个源代码了
好这是我们的第一感觉用switch做;那有些人可能会说 那我第一感觉不是switch啊
那没有关系,那咱就算这是你的第二感觉
接下来我们将使用for循环来再写一次
那我们既然是求到当前月之前的所有月份的天数和
那我们for框架是不是就可以定义为
这样month之前有几个月是不是就循环多少次啊,加的个数是正确的对吧
因为是当前月之前,所以小于输入的月份month
要注意现在我们的循环变量( i )就变成了我们要判断的月份(一定注意要对( i )进行判断,不是对month进行判断了
具体代码如下
如此看来选择的方式不同,代码量会有很大的不同
所以遇到问题还是需要考虑实现的繁简程度,再决定实现方法吧