我遇到此代码的问题,我不明白该功能是如何工作的。我需要验证用户的输入,看看他们放置的日期是否有效。如果不是,我设置错误代码。所以在我的读取函数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));
}
答案 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
是用户日期输入的日期部分。