#include <iostream>
using namespace std;
#include <iostream>
// type for representing day in a month: [1, 31]
typedef int Day;
// type for representing a month: JAN for January, etc.
enum Month {JAN =1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
// return next month
Month inc(Month m);
// return previous month
Month dec(Month m);
// check if given year is leap
bool isLeap(int year);
// set next date (account leap years)
void nextDate(int & year, Month & month, Day & day);
// return next month
Month inc(Month m) {
return (m == DEC) ? JAN : static_cast<Month> (m + 1);
}
// return previous month
Month dec(Month m) {
return (m==JAN) ? DEC :static_cast<Month> (m-1);
}
// check if given year is leap
bool isLeap(int year) {
if (year % 400==0)
return true;
else
if ((year % 100!=0)&&(year % 4 ==0))
return true;
else
return false;
}
// set next date (account leap years)
void nextDate(int & year, Month & month, Day & day) {
switch(day) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27: {
day++;
break;
}
case 28: {
if (!(isLeap(year))&&(month==FEB)) {
day=1;
inc(month);
}
else day++;
break;
}
case 29: {
if (month==FEB){
month = inc(month);
day=1;
}
else day++;
break;
}
case 30: {
if ((month==APR)||(month==JUN)||(month==SEP)||(month==NOV)) {
day=1;
inc(month);
}
else
day++;
break;
}
case 31: {
if (month==DEC)
year++;
day=1;
inc(month);
break;
}
}
}
using namespace std;
int main() {
int y = 2012;
Month m = FEB;
Day d = 28;
nextDate ( y, m, d );
cout << "was: " << y << " " << m << " " << d << endl;
nextDate ( y, m, d );
cout << "become: " << y << " " << m << " " << d << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPGlvc3RyZWFtPgogCi8vIHR5cGUgZm9yIHJlcHJlc2VudGluZyBkYXkgaW4gYSBtb250aDogWzEsIDMxXQp0eXBlZGVmIGludCBEYXk7CiAKLy8gdHlwZSBmb3IgcmVwcmVzZW50aW5nIGEgbW9udGg6IEpBTiBmb3IgSmFudWFyeSwgZXRjLgplbnVtIE1vbnRoIHtKQU4gPTEsIEZFQiwgTUFSLCBBUFIsIE1BWSwgSlVOLCBKVUwsIEFVRywgU0VQLCBPQ1QsIE5PViwgREVDfTsKIAovLyByZXR1cm4gbmV4dCBtb250aApNb250aCBpbmMoTW9udGggbSk7CiAKLy8gcmV0dXJuIHByZXZpb3VzIG1vbnRoCk1vbnRoIGRlYyhNb250aCBtKTsKIAovLyBjaGVjayBpZiBnaXZlbiB5ZWFyIGlzIGxlYXAKYm9vbCBpc0xlYXAoaW50IHllYXIpOwogCi8vIHNldCBuZXh0IGRhdGUgKGFjY291bnQgbGVhcCB5ZWFycykKdm9pZCBuZXh0RGF0ZShpbnQgJiB5ZWFyLCBNb250aCAmIG1vbnRoLCBEYXkgJiBkYXkpOwoKLy8gcmV0dXJuIG5leHQgbW9udGgKTW9udGggaW5jKE1vbnRoIG0pIHsKICAgIHJldHVybiAobSA9PSBERUMpID8gSkFOIDogc3RhdGljX2Nhc3Q8TW9udGg+IChtICsgMSk7Cn0KIAovLyByZXR1cm4gcHJldmlvdXMgbW9udGgKTW9udGggZGVjKE1vbnRoIG0pIHsgCiAgICByZXR1cm4gKG09PUpBTikgPyBERUMgOnN0YXRpY19jYXN0PE1vbnRoPiAobS0xKTsKfQogCi8vIGNoZWNrIGlmIGdpdmVuIHllYXIgaXMgbGVhcApib29sIGlzTGVhcChpbnQgeWVhcikgewogICAgaWYgICh5ZWFyICUgNDAwPT0wKQogICAgICAgIHJldHVybiB0cnVlOwogICAgZWxzZQogICAgaWYgICgoeWVhciAlIDEwMCE9MCkmJih5ZWFyICUgNCA9PTApKQogICAgICAgIHJldHVybiB0cnVlOwogICAgZWxzZQogICAgICAgIHJldHVybiBmYWxzZTsKIAp9CiAKLy8gc2V0IG5leHQgZGF0ZSAoYWNjb3VudCBsZWFwIHllYXJzKQp2b2lkIG5leHREYXRlKGludCAmIHllYXIsIE1vbnRoICYgbW9udGgsIERheSAmIGRheSkgIHsgCiAgICBzd2l0Y2goZGF5KSB7CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICBjYXNlIDQ6CiAgICBjYXNlIDU6CiAgICBjYXNlIDY6CiAgICBjYXNlIDc6CiAgICBjYXNlIDg6CiAgICBjYXNlIDk6CiAgICBjYXNlIDEwOgogICAgY2FzZSAxMToKICAgIGNhc2UgMTI6CiAgICBjYXNlIDEzOgogICAgY2FzZSAxNDoKICAgIGNhc2UgMTU6CiAgICBjYXNlIDE2OgogICAgY2FzZSAxNzoKICAgIGNhc2UgMTg6CiAgICBjYXNlIDE5OgogICAgY2FzZSAyMDoKICAgIGNhc2UgMjE6CiAgICBjYXNlIDIyOgogICAgY2FzZSAyMzoKICAgIGNhc2UgMjQ6CiAgICBjYXNlIDI1OgogICAgY2FzZSAyNjoKICAgIGNhc2UgMjc6IHsKICAgICAgICBkYXkrKzsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgMjg6IHsKICAgICAgICBpZiAoIShpc0xlYXAoeWVhcikpJiYobW9udGg9PUZFQikpIHsKICAgICAgICAgICAgZGF5PTE7CiAgICAgICAgICAgIGluYyhtb250aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgZGF5Kys7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIDI5OiB7CiAgICAgICAgaWYgKG1vbnRoPT1GRUIpewogICAgICAgICAgICBtb250aCA9IGluYyhtb250aCk7CiAgICAgICAgICAgIGRheT0xOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxzZSBkYXkrKzsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgMzA6IHsKICAgICAgICBpZiAoKG1vbnRoPT1BUFIpfHwobW9udGg9PUpVTil8fChtb250aD09U0VQKXx8KG1vbnRoPT1OT1YpKSB7CiAgICAgICAgICAgIGRheT0xOwogICAgICAgICAgICBpbmMobW9udGgpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGRheSsrOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAzMTogewogICAgICAgIGlmIChtb250aD09REVDKQogICAgICAgIHllYXIrKzsKICAgICAgICBkYXk9MTsKICAgICAgICBpbmMobW9udGgpOwogICAgICAgIGJyZWFrOwogICAgIH0KICB9Cn0KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbWFpbigpIHsKICAgIGludCB5ID0gMjAxMjsKICAgIE1vbnRoIG0gPSBGRUI7CiAgICBEYXkgZCA9IDI4OwogICAgCiAgICBuZXh0RGF0ZSAoIHksIG0sIGQgKTsKICAgIAogICAJY291dCA8PCAid2FzOiAiIDw8IHkgPDwgIiAiIDw8IG0gPDwgIiAiIDw8IGQgPDwgZW5kbDsKICAgIAogICAgbmV4dERhdGUgKCB5LCBtLCBkICk7CiAgICAKCWNvdXQgPDwgImJlY29tZTogIiA8PCB5IDw8ICIgIiA8PCBtIDw8ICIgIiA8PCBkIDw8IGVuZGw7Cn0=