#include #include using namespace std; class Date { int m_d, m_m, m_y; int m_totaldays; static bool is_valid(int, int, int); static bool is_leap(int y) { return y % 4 == 0 && y % 100 != 0 || y % 400 == 0; } static int ms_daytabs[][13]; static int ms_yeartabs[2]; static const char *ms_days[]; static const char *ms_mons[]; static const int msc_yearbase = 1700; static const int msc_factor = 3; void set_totaldays(); void revdate(int totaldays); public: Date(int, int, int); Date(); int get_year_day()const; int get_week_day()const; int get_mday()const {return m_d;} int get_mon()const {return m_m;} int get_year()const {return m_y;} Date &operator+=(int n); Date &operator-=(int n); Date &operator++(); Date operator++(int); Date &operator--(); Date operator--(int); //friend functions friend std::ostream &operator<<(std::ostream &, const Date &); friend std::istream &operator<<(std::istream &, Date &); friend bool operator<(const Date &, const Date &); friend int operator-(const Date &, const Date &); }; class BadDate{}; //////////////////////////////////////////////////////////////////////////////// //GLOBAL FUNCTION DECLARATIONS bool operator>(const Date &, const Date &); bool operator>=(const Date &, const Date &); bool operator<=(const Date &, const Date &); bool operator==(const Date &, const Date &); bool operator!=(const Date &, const Date &); Date operator+(const Date &, int); Date operator+(int, const Date &); Date operator-(const Date &, int); //////////////////////////////////////////////////////////////////////////////// int Date::ms_daytabs[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; //////////////////////////////////////////////////////////////////////////////// int Date::ms_yeartabs[] = {365, 366}; //////////////////////////////////////////////////////////////////////////////// const char *Date::ms_mons[] = {"", "Ocak", "Subat", "Mart", "Nisan", "Mayis", "Haziran", "Temmuz", "Agustos", "Eylul","Ekim", "Kasim", "Aralik"}; //////////////////////////////////////////////////////////////////////////////// const char *Date::ms_days[] = {"Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi", "Pazar"}; //////////////////////////////////////////////////////////////////////////////// Date::Date(int d, int m, int y) { if (!is_valid(d, m, y)) throw BadDate(); m_d = d; m_m = m; m_y = y; set_totaldays(); } //////////////////////////////////////////////////////////////////////////////// Date::Date() { time_t timer = time(0); tm *tp = localtime(&timer); m_d = tp->tm_mday; m_m = tp->tm_mon + 1; m_y = tp->tm_year + 1900; set_totaldays(); } //////////////////////////////////////////////////////////////////////////////// int Date::get_year_day()const { int yearday = m_d; for (int k = 1; k < m_m; ++k) yearday += ms_daytabs[is_leap(m_y)][k]; return yearday; } //////////////////////////////////////////////////////////////////////////////// int Date::get_week_day()const { return (m_totaldays + msc_factor) % 7; } //////////////////////////////////////////////////////////////////////////////// Date &Date::operator+=(int n) { revdate(m_totaldays + n); return *this; } //////////////////////////////////////////////////////////////////////////////// Date &Date::operator-=(int n) { revdate(m_totaldays - n); return *this; } //////////////////////////////////////////////////////////////////////////////// Date &Date::operator++() { return *this += 1; } //////////////////////////////////////////////////////////////////////////////// Date Date::operator++(int) { Date retval(*this); ++*this; return retval; } //////////////////////////////////////////////////////////////////////////////// Date &Date::operator--() { return *this -= 1; } //////////////////////////////////////////////////////////////////////////////// Date Date::operator--(int) { Date retval(*this); --*this; return retval; } //////////////////////////////////////////////////////////////////////////////// void Date::set_totaldays() { m_totaldays = 0; for (int k = msc_yearbase; k < m_y; ++k) m_totaldays += ms_yeartabs[is_leap(k)]; m_totaldays += get_year_day(); } //////////////////////////////////////////////////////////////////////////////// void Date::revdate(int totaldays) { m_totaldays = totaldays; m_y = msc_yearbase; while (totaldays > ms_yeartabs[is_leap(m_y)]) totaldays -= ms_yeartabs[is_leap(m_y++)]; m_m = 1; while (totaldays > ms_daytabs[is_leap(m_y)][m_m]) totaldays -= ms_daytabs[is_leap(m_y)][m_m++]; m_d = totaldays; } //////////////////////////////////////////////////////////////////////////////// bool Date::is_valid(int d, int m, int y) { if (y < msc_yearbase) return false; if (m < 1 || m > 12) return false; return m > 0 && m <= ms_daytabs[is_leap(y)][m]; } //////////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &os, const Date &r) { return os << r.m_d << " " << Date::ms_mons[r.m_m] << " " << r.m_y << " " << Date::ms_days[r.get_week_day()]; } //////////////////////////////////////////////////////////////////////////////// istream &operator<<(istream &is, Date &r) { int d, m, y; is >> d >> m >> y; if (!Date::is_valid(d, m, y)) throw BadDate(); r.m_d = d; r.m_m = m; r.m_y = y; r.set_totaldays(); return is; } //////////////////////////////////////////////////////////////////////////////// bool operator<(const Date &d1, const Date &d2) { return d1.m_totaldays < d2.m_totaldays; } //////////////////////////////////////////////////////////////////////////////// bool operator>(const Date &d1, const Date &d2) { return d2 < d1; } //////////////////////////////////////////////////////////////////////////////// bool operator>=(const Date &d1, const Date &d2) { return !(d1 < d2); } //////////////////////////////////////////////////////////////////////////////// bool operator<=(const Date &d1, const Date &d2) { return !(d2 > d1); } //////////////////////////////////////////////////////////////////////////////// int operator-(const Date &d1, const Date &d2) { return d1.m_totaldays - d2.m_totaldays; } //////////////////////////////////////////////////////////////////////////////// Date operator+(const Date &d, int n) { return Date(d) += n; } //////////////////////////////////////////////////////////////////////////////// Date operator+(int n, const Date &d) { return d + n; } //////////////////////////////////////////////////////////////////////////////// Date operator-(const Date &d, int n) { return Date(d) -= n; } //////////////////////////////////////////////////////////////////////////////// int main() { Date d1(25, 2, 2004); Date d2(d1 + 20); while (d1 < d2) cout << d1++ << endl; return 0; }