Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <cassert>
- using namespace std;
- class Time
- {
- private:
- int d, m, y;
- public:
- Time(int d0, int m0, int y0)
- {
- assert( y >= 0 && 0 <= m && m < 12 && 0 <= d && d <= 30);
- d = d0; m = m0; y = y0;
- }
- void print_period()
- {
- cout << d;
- if (d == 1 || ( d > 20 && d % 10 == 1 ) ) cout << " день ";
- else if (d / 10 != 1 && 2 <= d % 10 && d % 10 <= 4) cout << " дня ";
- else cout << " дней ";
- cout << m;
- if (m == 1) cout << " месяц ";
- else if (2 <= m && m <= 4) cout << " месяца ";
- else cout << " месяцев ";
- cout << y;
- if (y == 1 || ( y > 20 && y % 10 == 1 ) ) cout << " год ";
- else if (y / 10 != 1 && 2 <= y % 10 && y % 10 <= 4) cout << " года ";
- else cout << " лет ";
- }
- };
- class Data
- {
- private:
- int day, month, year;
- //функция вычисляет число дней в месяце
- int daysM (int m, int y)
- {
- switch (m)
- {
- case 2 : if (y % 4) return 28; else return 29;
- case 4 : return 30;
- case 6 : return 30;
- case 9 : return 30;
- case 11 : return 30;
- default : return 31;
- }
- }
- public:
- //конструктор с проверкой
- Data (int d, int m, int y)
- {
- assert( y >= 1 && 1 <= m && m <= 12 && 1 <= d && d <= daysM(m, y) );
- day = d; month = m; year = y;
- }
- //функции, возвращающие значения полей класса
- int getDay() { return day; }
- int getMonth() { return month; }
- int getYear() { return year; }
- //функция позволяет установить новую дату
- void setData(int d, int m, int y)
- {
- assert( y >= 1 && 1 <= m && m <= 12 && 1 <= d && d <= daysM(m, y) );
- this -> day = d;
- this -> month = m;
- this -> year = y;
- }
- //функция выводит информацию о некоторой дате
- void print_data()
- {
- if (day < 10) cout << 0;
- cout << day << ".";
- if (month < 10) cout << 0;
- cout << month << "." << year;
- }
- //функция вычисляет дату следующего дня
- Data dataTomorrow()
- {
- int days = daysM(month, year);
- int d = day + 1;
- int m = month + ( d > days );
- int y = year + ( m > 12 );
- if ( d > days ) d -= days;
- if ( m > 12 ) m -= 12;
- Data Tomorrow (d, m, y);
- return Tomorrow;
- }
- //функция вычисляет дату предыдущего дня
- Data dataYesterday()
- {
- int d = day - 1;
- int m = month - ( d == 0 );
- int y = year - ( m == 0 );
- if ( m == 0 ) m = 12;
- if ( d == 0 ) d = daysM(m, y);
- Data Yesterday (d, m, y);
- return Yesterday;
- }
- //функция вычисляет дату дня через заданное кол-во дней, месяцев и лет
- Data add (int d, int m, int y)
- {
- Data futureData (day, month, year);
- while(d--) futureData = futureData.dataTomorrow();
- int new_month = (futureData.getMonth() + m) % 12;
- if ( new_month == 0 ) new_month = 12;
- int new_year = futureData.getYear() + y + ( (futureData.getMonth() + m - 1) / 12 );
- int new_day = min ( futureData.getDay(), daysM(new_month, new_year) );
- futureData.setData(new_day, new_month, new_year);
- return futureData;
- }
- //функция вычисляет временной отрезок между двумя заданными датами
- Time operator- (Data data)
- {
- int y = year - data.getYear();
- int m = month - data.getMonth();
- if ( m < 0 ) { y -= 1; m += 12; }
- int d = day - data.getDay();
- if ( d < 0 ) { m -= 1; d += daysM(data.getMonth(), data.getYear()); }
- Time res (d, m, y);
- return res;
- }
- };
- int main()
- {
- cout << "Введите сегодняшнюю дату: ";
- int myDay, myMonth, myYear;
- cin >> myDay >> myMonth >> myYear;
- Data myToday (myDay, myMonth, myYear);
- Data myYesterday = myToday.dataYesterday();
- Data myTomorrow = myToday.dataTomorrow();
- cout << "\nВчерашняя дата: "; myYesterday.print_data();
- cout << "\nСегодняшняя дата: "; myToday.print_data();
- cout << "\nЗавтрашняя дата: "; myTomorrow.print_data();
- cout << "\n\nПодсчитаем дату через заданное кол-во дней, месяцев и лет:\n\n";
- int d, m, y;
- cout << "Введите число дней: "; cin >> d;
- cout << "Введите число месяцев: "; cin >> m;
- cout << "Введите число лет: "; cin >> y;
- Data myFuture = myToday.add(d, m, y);
- cout << "\nЧерез заданное кол-во дней, месяцев и лет будет: "; myFuture.print_data();
- cout << "\n\nПодсчитаем временной промежуток между двумя заданными датами:\n\n";
- cout << "Дата №1: ";
- int d1, m1, y1;
- cin >> d1 >> m1 >> y1;
- Data data1 (d1, m1, y1);
- cout << "Дата №2: ";
- int d2, m2, y2;
- cin >> d2 >> m2 >> y2;
- Data data2 (d2, m2, y2);
- Time res = data2 - data1;
- cout << "\nВременной промежуток: "; res.print_period();
- return 0;
- }
Add Comment
Please, Sign In to add comment