gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:35:12 29 4
gpt4 key购买 nike

我有一些代码用于检查输入日期是否正确。只需检查是否不超过 12 个月,给定月份中的日期是否正确,并且还应该考虑闰年(因此,基本上是正常的日期检查)。唯一不合适的是年份不应低于 2000。如果日期无效,函数应返回“INVALID_DATE”(在 header 中定义为 -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;}
}

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

最佳答案

if(...){return INVALID_DATE;break;} 仅当 if 为 true 时才会中断。否则就会失败。

所以你的电话

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;

关于检查(断言)有效日期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483744/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com