#pragma once #include #include class Date { public: Date(int year, int month, int day) { this->year = year; this->month = month; this->day = day; } bool IsLeap() const { if (year % 4 == 0) { if (year % 100 == 0) { if (year % 400 == 0) { return true; } else { return false; } } else { return true; } } else { return false; } } std::string ToString() const { std::string result = ""; if (day < 10) { result += "0"; } result += std::to_string(day); result += "."; if (month < 10) { result += "0"; } result += std::to_string(month); result += "."; if (year < 10) { result += "000"; } else if (year < 100) { result += "00"; } else if (year < 1000) { result += "0"; } result += std::to_string(year); return result; } Date DaysLater(int days) const { int* cur_month = new int[12]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; Date d(this->year, this->month, this->day); if (d.month <= 2 && d.IsLeap()) { cur_month[1] = 29; } for (int i = 0; i < days; i++) { d.day++; if (d.day > cur_month[d.month - 1]) { d.day = 1; d.month++; if (d.month > 12) { d.month = 1; d.year++; if (d.IsLeap()) { cur_month[1] = 29; } else { cur_month[1] = 28; } } } } delete [] cur_month; return d; } int DaysLeft(const Date& date) const { int* cur_month = new int[12]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; Date d(date.year, date.month, date.day); if (d.month > 2 && d.IsLeap()) { cur_month[1] = 29; } int res = 0; while (d.day != day || d.month != month || d.year != year) { d.day--; res++; if (d.day == 0) { d.month--; if (d.month == 0) { d.month = 12; } d.day = cur_month[d.month - 1]; if (d.month == 12) { d.year--; if (d.IsLeap()) { cur_month[1] = 29; } else { cur_month[1] = 28; } } } } delete [] cur_month; return res; } private: int year, month, day; };