检查(断言)有效日期失败

时间:2017-11-25 07:48:42

标签: c function time

我有一些代码可以检查输入日期是否正确。只检查是否有不超过12个月,如果给定月份的天数是正确的,它也应该考虑到成熟的年份(所以,基本上是正常的日期检查)。只有不合适的事情是年份不应低于2000.如果日期无效,该功能应返回" INVALID_DATE" (在标题中定义为-1),如果有效则应返回1.

#define INVALID_DATE (-1)
int valid_date(int y,int m,int d){
  if(y<2000){
    return INVALID_DATE;
  }
  if(m>12){
    return INVALID_DATE;
  }

  if ( y%400 == 0){                 //chcek for leapyear
    if((m==2)&&(d>29)){return INVALID_DATE;}
  }
  else if ( y%4 == 0 ){
    if((m==2)&&(d>29)){return INVALID_DATE;}
  }

  switch(m) {             //chcek if number of days is correct in given month
    case 1: if(d>31){return INVALID_DATE;break;}
    case 2: if(d>28){return INVALID_DATE;break;}
    case 3: if(d>31){return INVALID_DATE;break;}
    case 4: if(d>30){return INVALID_DATE;break;}
    case 5: if(d>31){return INVALID_DATE;break;}
    case 6: if(d>30){return INVALID_DATE;break;}
    case 7: if(d>31){return INVALID_DATE;break;}
    case 8: if(d>31){return INVALID_DATE;break;}
    case 9: if(d>30){return INVALID_DATE;break;}
    case 10:  if(d>31){return INVALID_DATE;break;}
    case 11:  if(d>30){return INVALID_DATE;break;}
    case 12:  if(d>31){return INVALID_DATE;break;}
  }
  return 1;
}

int main( int argc, char * argv [] ){
  assert(valid_date ( 2018, 1, 20 ) == 1);
  assert(valid_date(2000,14,10)==INVALID_DATE);
  assert(valid_date(2000,11,31)==INVALID_DATE);
  assert(valid_date(2000,2,29)==INVALID_DATE);
  assert(valid_date(2004,2,29)==1);         //fails
  assert(valid_date(2100,2,29)==INVALID_DATE);
  assert(valid_date ( 2018, 1, 28) == 1);
  assert(valid_date ( 2018, 1, 29) == 1); //fails
  assert(valid_date ( 2018, 1, 30) == 1); //fails
  assert(valid_date ( 2018, 1, 31) == 1);  //fails
}

我对失败的行(断言)有评论。我可以理解它在三年级检查中失败了,我不确定我是否正确写了但是当它有一天高于28时它为什么会失败。有人可以告诉我我做错了什么吗?

谢谢。

PS。这是学校的功课。 (如果重要的话)

修正了开关(m)。改变

case 1: if(d>31){return INVALID_DATE;break;}

case 1: if(d>31){return INVALID_DATE;}break;

它有效。谢谢。

仍然需要弄清楚为什么我的闰年不起作用。我试着把它重写为

if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)){
if(m==2&&d>29){return INVALID_DATE;}
}

但它没有帮助。有人知道它为什么不起作用吗?

1 个答案:

答案 0 :(得分:3)

if(...){return INVALID_DATE;break;}只会在if为真时中断。否则它将落空。

所以你的电话

assert(valid_date ( 2018, 1, 29) == 1);

将执行:

    case 1: if(d>31){return INVALID_DATE;break;}  // if is false; fall through
    case 2: if(d>28){return INVALID_DATE;break;}  // if is true: return invalid date

你想要的是:

    case 1: if(d>31) return INVALID_DATE; break;
    case 2: if(d>28) return INVALID_DATE; break;

所以当检查为false时执行break,表示数据正常,然后在函数结束时执行return 1;