我有一些代码可以检查输入日期是否正确。只检查是否有不超过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;}
}
但它没有帮助。有人知道它为什么不起作用吗?
答案 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;
。