NickAndNick

Дата

Nov 23rd, 2019
90
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // https://otvet.mail.ru/question/217374813
  2. #include <iostream>
  3. using namespace std;
  4. struct Date {
  5.     int year;
  6.     int month;
  7.     int day;
  8.     Date() : year(1900), month(1), day(1) {}
  9.     Date(int y, int m, int d) : year(y), month(m), day(d) {
  10.         if ((month > 12 || month <= 0 || day <= 0 || year <= 0)
  11.             || (isLeapYear() && day > leap[month])
  12.             || (!isLeapYear() && day > months[month])) {
  13.             year = 1900;
  14.             month = day = 1;
  15.         }
  16.     }
  17.     static const int months[13];
  18.     static const int leap[13];
  19.     bool isLeapYear() {
  20.         bool result;
  21.         if (year % 4 != 0) result = false;
  22.         else if (0 == year % 400) result = true;
  23.         else if (0 == year % 100) result = false;
  24.         else result = true;
  25.         return result;
  26.     }
  27.     int monthDays() {
  28.         if (isLeapYear()) return leap[month];
  29.         return months[month];
  30.     }
  31.     void tonextDate() {
  32.         if (!isLeapYear() && day != months[month]) ++day;
  33.         else if (isLeapYear() && day != leap[month]) ++day;
  34.         else if (month < 12) {
  35.             ++month;
  36.             day = 1;
  37.         } else {
  38.             ++year;
  39.             month = day = 1;
  40.         }
  41.     }
  42.     void toprevDate() {
  43.         if (day != 1) --day;
  44.         else {
  45.             if (month != 1) --month;
  46.             else {
  47.                 --year;
  48.                 month = 12;
  49.                 day = 31;
  50.             }
  51.             if (isLeapYear()) day = leap[month];
  52.             else day = months[month];
  53.         }
  54.     }
  55.     void addDays(int d) {
  56.         if (d <= 0) return;
  57.         for (int i = 0; i < d; ++i) tonextDate();
  58.     }
  59.     void delDays(int d) {
  60.         if (d <= 0) return;
  61.         for (int i = 0; i < d; ++i) toprevDate();
  62.     }
  63.     int cmpDate(Date date) {
  64.         auto is_equal = [this, &date]() {
  65.             return year == date.year && month == date.month && day == date.day;
  66.         };
  67.         auto is_less = [this, &date]() {
  68.             if (year < date.year) return true;
  69.             else if (year == date.year && month < date.month) return true;
  70.             else if (year == date.year && month == date.month && day < date.day) return true;
  71.             return false;
  72.         };
  73.         if (is_equal()) return 0;
  74.         int diff = 0;
  75.         if (is_less()) {
  76.             while (!is_equal()) {
  77.                 date.toprevDate();
  78.                 ++diff; // если дата, переданная в качестве параметра больше
  79.             }
  80.         } else {
  81.             while (!is_equal()) {
  82.                 date.tonextDate();
  83.                 --diff; // если дата, переданная в качестве параметра меньше
  84.             }
  85.         }
  86.         return diff;
  87.     }
  88.     friend ostream& operator<<(ostream& out, const Date& date) {
  89.         out << date.year << '-';
  90.         if (date.month < 10) out << '0';
  91.         out << date.month << '-';
  92.         if (date.day < 10) out << '0';
  93.         out << date.day;
  94.         return out;
  95.     }
  96. };
  97. const int Date::months[13] = { 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  98. const int Date::leap[13] = { 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  99. int main() {
  100.     Date a(2019, 11, 24);
  101.     cout << a << '\n';
  102.     cin.get();
  103. }
RAW Paste Data