问答详情
源自:4-16 分支结构之switch语句

我按照日期计算器的形式写的不知道对不对,请求大家帮我看下对不对?我自己没发现问题

#include <stdio.h>
int main()
{
    int year = 2008;
    int month = 8;
    int day = 8;
    int sum;
    switch(year%400==0||(year%4==0&&year%100!=0))
    {
        case 1:
            if(month%2==0)
            {
                sum = ((month-1)-1)/2*31 + (((month-1)-1)/2-1)*30 + 31 + 29 + day;
            }else
            {
                sum = (month-1)/2*31 + ((month-1)-1)/2*30 + 29 + day;
            }
            break;
        case 0:
            if(month%2==0)
            {
                sum = ((month-1)-1)/2*31 + (((month-1)-1)/2-1)*30 + 31 + 28 + day;
            }else
            {
                sum = (month-1)/2*31 + ((month-1)-1)/2*30 + 28 + day;
            }
            break;
    }
    printf("%d年%d月%d日是该年的第%d天",year,month,day,sum);

提问者:Joooe 2017-12-29 19:39

个回答

  • 划水人
    2017-12-29 21:57:43
    已采纳

    switch中sum的表达式不对,看你的意思应该是想计算单数月的个数*31加上偶数月的个数*30,而且要抛出2月另作运算。就以当前为例,那么程序会进入到case为1的if语句对吧。这个时候,((month-1)-1)/2是等于3的,然而8月之前的大月有四个。再例如,考虑当month为9时,这是会进入case为0的else语句吧。这时(month-1)/2为4;但是9月前的大月有5个,1 3 5 7 8;其次((month-1)-1)/2为3(因为变量都是int类型,3.5会转成3),但是如果你把二月单一拿出来在后面+28;9月前的小月就只有4和6两个月,这也是个错误。  你要判断大月小月个数,还要把二月抛出来另外考虑,算法还蛮复杂的。因为我们的月份就很复杂,二月的天数因为年份的不同而不同外,八月和九月这两个相连的月还都是大月,所以判断是很复杂的。