Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Южный федеральный университет, ИКТИБ, кафедра МОП ЭВМ
- * Гатауллин Руслан Рустемович
- * Написано 04.09.2020
- */
- // Библиотеки ввода-вывода
- #include <iostream>
- #include <iomanip>
- // Заголовочный файл класса даты
- #include "date.h"
- // Конструктор по умолчанию
- Date::Date() : _day(1), _mouth(1), _year(0)
- {}
- // Конструктор из трех полей
- Date::Date(unsigned char day, unsigned char mouth, int year)
- : _day(day), _mouth(mouth), _year(year)
- {}
- // Конструктор копирования
- Date::Date(const Date &other) : _day(other._day), _mouth(other._mouth), _year(other._year)
- {}
- // Потоковый вывод
- std::ostream &operator<<(std::ostream &os, Date const &to_out)
- {
- os << std::setfill('0') << std::setw(2) << (short) to_out._day << '.';
- os << std::setfill('0') << std::setw(2) << (short) to_out._mouth << '.';
- os << std::setfill('0') << std::setw(4) << to_out._year;
- return os;
- }
- // Потоковый ввод
- std::istream &operator>>(std::istream &is, Date &to_in)
- {
- int day;
- is >> day;
- is.ignore(1);
- int mouth;
- is >> mouth;
- is.ignore(1);
- int year;
- is >> year;
- // Проверяем на ошибки
- if (mouth <= 0 || mouth > 12)
- throw std::runtime_error("неправильный номер месяца");
- if (day <= 0 || day > mouths[mouth - 1])
- throw std::runtime_error("неправильный номер дня");
- to_in._year = year;
- to_in._mouth = mouth;
- to_in._day = day;
- return is;
- }
- // Процедура прибавления к дате целой константы
- Date Date::operator+(unsigned long int d)
- {
- Date ans = *this;
- d += ans._day;
- // Пробегаем лишние года, УЧИТЫВАЯ(!) високосные
- while (d > 366)
- {
- // просчитываем, проходим ли мы высокосный год с 1 лишним днем
- d -= ((ans._year % 4 == 0) &&
- ((ans._year % 100 != 0) || (ans._year % 400 == 0)) &&
- (ans._mouth <= 2) && (ans._day < 29)) ? 366 : 365;
- // Увеличиваем количество годов
- ans._year++;
- // Проверяем, не прошли ли мы случайно 29-е февраля
- if ((ans._year % 4 == 0) &&
- ((ans._year % 100 != 0) || (ans._year % 400 == 0)) &&
- (ans._mouth > 2))
- d--;
- }
- // Пробегаем лишние месяца, основываясь
- // на массиве констрант, где каждый i-й элемент - количкство дней в i+1 месяце
- while (d > mouths[ans._mouth - 1])
- {
- // Проверяем, пробегаем ли феврать
- if (ans._mouth == 2)
- {
- // Если пробегаем високосный февраль, отнимаем 29 дней, иначе 28
- d -= ((ans._year % 4 == 0) && ((ans._year % 100 != 0) || (ans._year % 400 == 0))) ? 29 : 28;
- }
- else
- d -= mouths[ans._mouth - 1]; // Если же не пробегаем февраль, отнимаем обычное количество дней
- // увеличиваем количество месяцев
- ans._mouth++;
- // Если проскочили декабрь, ставим следующий год
- if (ans._mouth > 12)
- {
- ans._mouth = 1;
- ans._year++;
- }
- }
- // В конечном итоге ставим день месяца
- ans._day = d;
- return ans;
- }
- // Функция определения дня недели по дате
- // Алгоритм взят с википедии и способен определять день недели
- // по дате с момента принятия нынешнего карендаря
- // НЕ РАБОТАЕТ для определения дня недели в России до 1918 года (год принятия григориянского календаря)
- unsigned short Date::dayOfWeek() const
- {
- unsigned long long year = _year, mouth;
- if (_mouth == 1 || _mouth == 2)
- {
- year = _year - 1;
- mouth = _mouth + 10;
- }
- else
- mouth = _mouth - 2;
- unsigned short a = (_day + (31 * mouth) / 12 + year + year / 4 - year / 100 + year / 400) % 7;
- return (a == 0) ? 7 : a;
- }
- // Получение поля дня
- unsigned short Date::get_day() const
- {
- return _day;
- }
- // Получение закрытого поля месяца
- unsigned short Date::get_mouth() const
- {
- return _mouth;
- }
- // Получение закрытого поля года
- int Date::get_year() const
- {
- return _year;
- }
- // Передача значения закрытому полю _day
- void Date::set_day(unsigned short day)
- {
- if (day >= mouths[_mouth - 1] || day == 0) throw std::runtime_error("неправильный номер дня");
- _day = day;
- }
- // Передача значения закрытому полю _mouth
- void Date::set_mouth(unsigned short mouth)
- {
- if (mouth > 12 || mouth == 0) throw std::runtime_error("неправильный номер месяца");
- _mouth = mouth;
- }
- // Передача значения закрытому полю _year
- void Date::set_year(int year)
- {
- _year = year;
- }
Advertisement
Add Comment
Please, Sign In to add comment