jessica
jessica

Reputation: 11

Explain this leap year Function C++

I'm having an issue with this code,I do not understand how the function works. I need to validate the input from the user, to see if their date that they placed is valid. And if it isn't I set the error code. So in my read function I cin the date then validate the input and call mdays() however, for some reason I don't know how to check in my if statement in the read function if the date is validate or not.

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));
}

Upvotes: 1

Views: 454

Answers (3)

tivn
tivn

Reputation: 1923

If you can modify the Date class, you should be able to create new method utilizing return value of mdays() like this:

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;
}

Here, _day is the day part of the user date input.

Upvotes: 0

Xiaotian Pei
Xiaotian Pei

Reputation: 3260

You can change the signature of mdays(), return a boolean to indicate if the date is validate or not, and put an output argument to store the days if the date is validate

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;
}

Upvotes: 0

gnasher729
gnasher729

Reputation: 52538

The code is very clever, written by someone who wanted to demonstrate that they are smart. I hate clever code. (It's also quite slow, I hate code that tries to be clever and fails).

Remember the rules for leapyears:

Every fourth year is a leap year. Except that every 100th year is not a leap year. Except that every 400th year is a leap year.

Most months you can look up from a table, except that February has either 28 or 29 days. So to understand the code, what happens if the month is not February? And what happens if the month is February? mon will be equal to 1. What is the value of (mon == 1) in February? How would you express the rules for leap years?

And the function that you showed calculates the number of days in a month, it doesn't do any validation. Obviously you need to know that April has 30 days to know that April 31st is invalid.

Upvotes: 2

Related Questions