Tarih işlemlerini yapmak için tanımlanan Date sınıfı.
///////////////////// date.h ///////////////////////////// #include <iosfwd> #include <stdexcept> 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 && 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[]; const static int msc_yearbase = 1700; const static int msc_factor = 0; void set_totaldays(); void set(int, int, int); Date &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 n); //postfix Date &operator--(); Date operator--(int n); //postfix //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:public std::out_of_range{ public: BadDate(const char *pmsg):std::out_of_range(pmsg){} }; //global functions 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); /////////////////////////////////////////////////////////////////////////// //date.cpp file #include <iostream> #include <iomanip> #include <ctime> using namespace std; 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", "Mayıs", "Haziran", "Temmuz", "Agustos", "Eylul", "Ekim", "Kasim", "Aralik"}; const char *Date::ms_days[] = {"Pazartesi", "Sali", "Carsamba", "Persembe", "Cuma", "Cumartesi", "Pazar"}; /////////////////////////////////////////////////////////////////////////// void Date::set(int d, int m, int y) { if (!is_valid(d, m, y)) throw BadDate("gecersiz tarih\n"); m_d = d; m_m = m; m_y = y; set_totaldays(); } /////////////////////////////////////////////////////////////////////////// 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(); } /////////////////////////////////////////////////////////////////////////// Date &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; return *this; } /////////////////////////////////////////////////////////////////////////// Date::Date(int d, int m, int y) { set(d, m, y); } /////////////////////////////////////////////////////////////////////////// Date::Date() { time_t timer = time(0); tm *tp = localtime(&timer); set(tp->tm_mday, tp->tm_mon + 1, tp->tm_year + 1900); } /////////////////////////////////////////////////////////////////////////// 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) { return revdate(m_totaldays + n); } /////////////////////////////////////////////////////////////////////////// Date &Date::operator-=(int n) { return revdate(m_totaldays - n); } /////////////////////////////////////////////////////////////////////////// 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; } /////////////////////////////////////////////////////////////////////////// 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 && d <= ms_daytabs[is_leap(y)][m]; } /////////////////////////////////////////////////////////////////////////// ostream &operator<<(ostream &os, const Date &r) { return os << setw(2) << 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; r.set(d, m, y); 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 today; Date next_year_today(today + 365); while (today <= next_year_today) cout << today++ << endl; return 0; }