Tvor0zhok

Класс

Mar 10th, 2021 (edited)
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cassert>
  4. using namespace std;
  5.  
  6. class Time
  7. {
  8. private:
  9.  
  10. int d, m, y;
  11.  
  12. public:
  13.  
  14. Time(int d0, int m0, int y0)
  15. {
  16. assert( y >= 0 && 0 <= m && m < 12 && 0 <= d && d <= 30);
  17.  
  18. d = d0; m = m0; y = y0;
  19. }
  20.  
  21. void print_period()
  22. {
  23. cout << d;
  24.  
  25. if (d == 1 || ( d > 20 && d % 10 == 1 ) ) cout << " день ";
  26. else if (d / 10 != 1 && 2 <= d % 10 && d % 10 <= 4) cout << " дня ";
  27. else cout << " дней ";
  28.  
  29. cout << m;
  30.  
  31. if (m == 1) cout << " месяц ";
  32. else if (2 <= m && m <= 4) cout << " месяца ";
  33. else cout << " месяцев ";
  34.  
  35. cout << y;
  36.  
  37. if (y == 1 || ( y > 20 && y % 10 == 1 ) ) cout << " год ";
  38. else if (y / 10 != 1 && 2 <= y % 10 && y % 10 <= 4) cout << " года ";
  39. else cout << " лет ";
  40. }
  41. };
  42.  
  43. class Data
  44. {
  45. private:
  46.  
  47. int day, month, year;
  48.  
  49. //функция вычисляет число дней в месяце
  50. int daysM (int m, int y)
  51. {
  52. switch (m)
  53. {
  54. case 2 : if (y % 4) return 28; else return 29;
  55. case 4 : return 30;
  56. case 6 : return 30;
  57. case 9 : return 30;
  58. case 11 : return 30;
  59. default : return 31;
  60. }
  61. }
  62.  
  63. public:
  64.  
  65. //конструктор с проверкой
  66. Data (int d, int m, int y)
  67. {
  68. assert( y >= 1 && 1 <= m && m <= 12 && 1 <= d && d <= daysM(m, y) );
  69.  
  70. day = d; month = m; year = y;
  71. }
  72.  
  73. //функции, возвращающие значения полей класса
  74. int getDay() { return day; }
  75. int getMonth() { return month; }
  76. int getYear() { return year; }
  77.  
  78. //функция позволяет установить новую дату
  79. void setData(int d, int m, int y)
  80. {
  81. assert( y >= 1 && 1 <= m && m <= 12 && 1 <= d && d <= daysM(m, y) );
  82.  
  83. this -> day = d;
  84. this -> month = m;
  85. this -> year = y;
  86. }
  87.  
  88. //функция выводит информацию о некоторой дате
  89. void print_data()
  90. {
  91. if (day < 10) cout << 0;
  92. cout << day << ".";
  93. if (month < 10) cout << 0;
  94. cout << month << "." << year;
  95. }
  96.  
  97. //функция вычисляет дату следующего дня
  98. Data dataTomorrow()
  99. {
  100. int days = daysM(month, year);
  101.  
  102. int d = day + 1;
  103. int m = month + ( d > days );
  104. int y = year + ( m > 12 );
  105.  
  106. if ( d > days ) d -= days;
  107. if ( m > 12 ) m -= 12;
  108.  
  109. Data Tomorrow (d, m, y);
  110. return Tomorrow;
  111. }
  112.  
  113. //функция вычисляет дату предыдущего дня
  114. Data dataYesterday()
  115. {
  116. int d = day - 1;
  117. int m = month - ( d == 0 );
  118. int y = year - ( m == 0 );
  119.  
  120. if ( m == 0 ) m = 12;
  121. if ( d == 0 ) d = daysM(m, y);
  122.  
  123. Data Yesterday (d, m, y);
  124. return Yesterday;
  125. }
  126.  
  127. //функция вычисляет дату дня через заданное кол-во дней, месяцев и лет
  128. Data add (int d, int m, int y)
  129. {
  130. Data futureData (day, month, year);
  131. while(d--) futureData = futureData.dataTomorrow();
  132.  
  133. int new_month = (futureData.getMonth() + m) % 12;
  134. if ( new_month == 0 ) new_month = 12;
  135.  
  136. int new_year = futureData.getYear() + y + ( (futureData.getMonth() + m - 1) / 12 );
  137.  
  138. int new_day = min ( futureData.getDay(), daysM(new_month, new_year) );
  139.  
  140. futureData.setData(new_day, new_month, new_year);
  141. return futureData;
  142. }
  143.  
  144. //функция вычисляет временной отрезок между двумя заданными датами
  145. Time operator- (Data data)
  146. {
  147. int y = year - data.getYear();
  148.  
  149. int m = month - data.getMonth();
  150. if ( m < 0 ) { y -= 1; m += 12; }
  151.  
  152. int d = day - data.getDay();
  153. if ( d < 0 ) { m -= 1; d += daysM(data.getMonth(), data.getYear()); }
  154.  
  155. Time res (d, m, y);
  156. return res;
  157. }
  158. };
  159.  
  160. int main()
  161. {
  162. cout << "Введите сегодняшнюю дату: ";
  163.  
  164. int myDay, myMonth, myYear;
  165. cin >> myDay >> myMonth >> myYear;
  166.  
  167. Data myToday (myDay, myMonth, myYear);
  168.  
  169. Data myYesterday = myToday.dataYesterday();
  170. Data myTomorrow = myToday.dataTomorrow();
  171.  
  172. cout << "\nВчерашняя дата: "; myYesterday.print_data();
  173. cout << "\nСегодняшняя дата: "; myToday.print_data();
  174. cout << "\nЗавтрашняя дата: "; myTomorrow.print_data();
  175.  
  176. cout << "\n\nПодсчитаем дату через заданное кол-во дней, месяцев и лет:\n\n";
  177.  
  178. int d, m, y;
  179.  
  180. cout << "Введите число дней: "; cin >> d;
  181. cout << "Введите число месяцев: "; cin >> m;
  182. cout << "Введите число лет: "; cin >> y;
  183.  
  184. Data myFuture = myToday.add(d, m, y);
  185.  
  186. cout << "\nЧерез заданное кол-во дней, месяцев и лет будет: "; myFuture.print_data();
  187.  
  188. cout << "\n\nПодсчитаем временной промежуток между двумя заданными датами:\n\n";
  189.  
  190. cout << "Дата №1: ";
  191.  
  192. int d1, m1, y1;
  193. cin >> d1 >> m1 >> y1;
  194.  
  195. Data data1 (d1, m1, y1);
  196.  
  197. cout << "Дата №2: ";
  198.  
  199. int d2, m2, y2;
  200. cin >> d2 >> m2 >> y2;
  201.  
  202. Data data2 (d2, m2, y2);
  203.  
  204. Time res = data2 - data1;
  205.  
  206. cout << "\nВременной промежуток: "; res.print_period();
  207.  
  208. return 0;
  209. }
Add Comment
Please, Sign In to add comment