解释这个闰年函数C ++

时间:2015-04-18 16:55:12

标签: c++

我遇到此代码的问题,我不明白该功能是如何工作的。我需要验证用户的输入,看看他们放置的日期是否有效。如果不是,我设置错误代码。所以在我的读取函数I cin中,日期然后验证输入并调用mdays()但是,由于某种原因我不知道如果日期是有效的,如何检查读取函数中的if语句或不。

int Date::mdays() const
{
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1};
    int mon = _mon >= 1 && _mon <= 12 ? _mon : 13;
    mon--;
    return days[mon] + int((mon == 1)*((_year % 4 == 0) &&
        (_year % 100 != 0)) || (_year % 400 == 0));
}

3 个答案:

答案 0 :(得分:2)

代码非常聪明,由想要证明自己聪明的人编写。我讨厌聪明的代码。 (它也很慢,我讨厌试图变得聪明且失败的代码)。

记住傻瓜的规则:

每四年都是闰年。除了每100年不是闰年。除了每400年是闰年。

大多数月份,您可以从表格中查找,但2月份有28天或29天。那么要了解代码,如果月份不是2月会发生什么?如果月份是2月会发生什么? mon等于1. 2月(mon == 1)的值是多少?您如何表达闰年的规则?

您显示的功能计算一个月内的天数,它不会进行任何验证。显然你需要知道四月有30天知道4月31日是无效的。

答案 1 :(得分:0)

您可以更改mdays()的签名,返回一个布尔值来指示日期是否有效,并输出一个输出参数来存储日期为验证日期

bool Date::mdays(int& month_days) const {
  int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  if (_mon < 1 || _mon > 12) return false;
  mon--;
  month_days = days[mon] + int((mon == 1)*((_year % 4 == 0) && (_year % 100 != 0)) || (_year % 400 == 0));
  return true;
}

答案 2 :(得分:0)

如果您可以修改Date类,您应该能够使用mdays()的返回值创建新方法,如下所示:

bool Date::validate_day_and_month() const {
    int maxday = mdays();
    if ( maxday < 0 ) { return false; } // mdays() = -1 if _month is bad
    if ( _day <= 0 || _day > maxday ) { return false; }
    return true;
}

此处,_day是用户日期输入的日期部分。