/*Конструктор Date(int year, int month, int day) Метод bool IsLeap() const, возвращающий true в случае, если год является високосным и false в противном случае. Метод std::string ToString() const, возвращающий строковое представление даты в формате dd.mm.yyyy. Метод Date DaysLater(int days) const, возвращающий дату, которая наступит спустя days дней от текущей. Метод int DaysLeft(const Date& date) const, возвращающий разницу между указанной и текущей датой (в днях).*/ #include #include #include class Date { private: int year; int mouth; int day; int mouth_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool CheckFreeDaysToMoth(int days) { return this->mouth_days[this->mouth] >= this->day + days; } public: Date(int year, int mouth, int day) { this->day = day; this->mouth = mouth; this->year = year; if (this->year % 4 == 0) this->mouth_days[1]++; } bool IsLeap() const { return year % 4 == 0; } bool operator==(const Date &date) const { return this->day == date.day && this->year == date.year && this->mouth == date.mouth; } std::string ToString() { std::string t; if (this->day < 10) { t = "0" + std::to_string(this->day) + "."; } else { t = std::to_string(this->day) + "."; } if (this->mouth < 10) { t += "0" + std::to_string(this->mouth) + "."; } else { t += std::to_string(this->mouth) + "."; } if (this->year < 10) { t += "000" + std::to_string(this->year); } else if (this->year < 100) { t += "00" + std::to_string(this->year); } else if (this->year < 1000) { t += "0" + std::to_string(this->year); } else { t += std::to_string(this->year); } return t; } Date DaysLater(int days) { Date New_date(this->year, this->mouth, this->day); if (CheckFreeDaysToMoth(days)) { New_date.day++; return New_date; } else { int delta_days = 0; while (days) { delta_days = New_date.mouth_days[mouth - 1] - New_date.day; if (delta_days >= 0) { days -= delta_days + 1; New_date.day = 1; New_date.mouth++; } else { days += delta_days; New_date.day = -delta_days; New_date.mouth++; } if (New_date.mouth > 12) { New_date.year++; New_date.mouth = 1; if (New_date.year % 4 == 0) New_date.mouth_days[1]++; else if (New_date.mouth_days[1] == 29) New_date.mouth_days[1]--; } } return New_date; } } int DaysLeft(const Date &date) { int k = 0; Date tmp_date(date.year, date.mouth, date.day); while (!(tmp_date == date)) { k++; tmp_date = tmp_date.DaysLater(k); } return k; } };