确定一个月内的天数

时间:2016-09-13 06:35:28

标签: c

我收到作为输入,我正在尝试以有效的方式验证输入。 范围为[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*/
}

我还没有看到另一条规则吗?

1 个答案:

答案 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 ]