我收到年,月和天作为输入,我正在尝试以有效的方式验证输入。 年范围为[0-99](0,4,8 ..被视为闰年),月范围[1-12]和日< / strong>范围[1-31]。
验证当天的直接方式如下:
if( (Day<1u) || (Day>31u) ){
/*error*/
}
else if ( (Month==4u) || (Month==6u) || (Month==9u) || (Month==11u) && (Day>30u) ){
/*error*/
}
else if ( (Month==2u) && (Year % 4u == 0u) && (Day > 29u) ){
/*error*/
}
else if ( (Month==2u) && (Year % 4u != 0u) && (Day > 28u) ){
/*error*/
}
else
{
/*valid*/
}
但它的复杂性很高。
查找表似乎是更好的选择。现在的问题是:
除了以下内容之外,是否有更有效的方法为此案例创建表格?
const int testTable[4][12] = {
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
if( testTable[ Year % 4 ][ Month - 1 ] >= Day){
/*valid*/
}
else{
/*error*/
}
我还没有看到另一条规则吗?
答案 0 :(得分:6)
闰年需要一个维度,非闰年需要另一个维度:
int isleap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int mthdays(int month, int year)
{
static const int days[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int leap = isleap(year);
return days[leap][month];
}
年份范围是[0-99](0,4,8 ..被视为闰年)
然后您的isleap()
函数必须是:
int isleap(int year)
{
return (year % 4 == 0);
}
月份范围[1-12]
使用:
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
而不是
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
您可以避免[ Month - 1 ]