구현 날짜 클래스

5321 단어
제목: 날짜 클래스를 실현하고 주로 날짜 계산 기능을 실현한다.
날짜+일수=날짜;
날짜-일수=날짜;
날짜-날짜=일수;
이 날짜류를 실현하려면 반드시 연산자 중재의 개념과 실현 방법을 숙련해야 한다.
작성된 날짜 클래스는 다음과 같습니다.
 
헤더 파일:
#ifndef __DATE_H__
#define __DATE_H__
#include<iostream>
using namespace std;
class Date
{
public:
 Date(int year = 1900, int month = 1, int day = 1);
 Date(const Date& d);
 Date& operator=(const Date& d);
 int DaysOfMonth();//      
 bool IsInvalid();//      
 bool IsLeapYear();//    
 void ToCorrectDate();//        
 Date& operator+=(int days);
 Date& operator-=(int days);
 friend ostream& operator<<(ostream& output, const Date& d);//       
 friend bool operator>(const Date& d1, const Date& d2);
 friend bool operator>=(const Date& d1, const Date& d2);
 friend bool operator<=(const Date& d1, const Date& d2);
 friend bool operator<(const Date& d1, const Date& d2);
 friend bool operator==(const Date& d1, const Date& d2);
 friend bool operator!=(const Date& d1, const Date& d2);
 
 friend Date operator+(const Date& d, int days);//  +  
 friend Date operator-(const Date& d, int days);//  -  
 friend int operator-(const Date& d1, const Date& d2);//  -  
private:
 int _year;
 int _month;
 int _day;
};
#endif

소스 파일:
Date::Date(int year, int month, int day)//    
:_year(year)
, _month(month)
, _day(day)
{
 if (IsInvalid())//         ,        
 {
      _year = 1900;
      _month = 1;
      _day = 1;
 }
}
Date::Date(const Date& d)//      
{
     _year = d._year;
     _month = d._month;
     _day = d._day;
}
Date& Date::operator=(const Date& d)//       
{
     _year = d._year;
     _month = d._month;
     _day = d._day;
     return *this;
}
int Date::DaysOfMonth()
{
     int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };        //              
     if (IsLeapYear())//           29 
     {
          days[2] += 1;
     }
         return days[_month];
}
bool Date::IsInvalid()
{
     if (_year < 1900 || _month < 0 || _month > 12 || _day < 0 || _day > DaysOfMonth())
           return true;
     else
           return false;
}
bool Date::IsLeapYear()
{
     return (_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0;
}
ostream& operator<<(ostream& output, const Date& d)//       
{
     output << d._year << "-" << d._month << "-" << d._day;
     return output;
}
bool operator==(const Date& d1, const Date& d2)
{
     return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);
}
bool operator!=(const Date& d1, const Date& d2)
{
     return !(d1 == d2);
}
bool operator>(const Date& d1, const Date& d2)
{
     if (d1._year > d2._year)
          return true;
     if (d1._year == d2._year)
     {
          if (d1._month > d2._month)
               return true;
      if (d1._month == d2._month)
      {
           if (d1._day > d2._day)
          {
                return true;
          }
      }
 }
 return false;
}
bool operator>=(const Date& d1, const Date& d2)
{
     return (d1 > d2) || (d1 == d2);
}
bool operator<=(const Date& d1, const Date& d2)
{
     return !(d1 > d2);
}
bool operator<(const Date& d1, const Date& d2)
{
     return !(d1 >= d2);
}
void Date::ToCorrectDate()
{
     while (_day <= 0)
     {
      if (_month == 1)
      {
           _month = 12;
           _year -= 1;
      }
      else
           _month--;
      _day += DaysOfMonth();
 }
 while (_day > DaysOfMonth())
 {
      _day -= DaysOfMonth();
      if (_month == 12)
      {
           _month = 1;
           _year += 1;
      }
      else
           _month++;
 }
}
Date operator+(const Date& d, int days)
{
     Date d1(d);
     d1._day += days;
     d1.ToCorrectDate();
     return d1;
}
Date& Date::operator+=(int days)
{
     _day += days;
     ToCorrectDate();
     return *this;
}
Date operator-(const Date& d, int days)
{
     Date d1(d);
     d1._day -= days;
     d1.ToCorrectDate();
     return d1;
}
Date& Date::operator-=(int days)
{
     _day -= days;
     ToCorrectDate();
     return *this;
}
int operator-(const Date& d1, const Date& d2)
{
     Date MinDate(d1);
     Date MaxDate(d2);
     int days = 0;
     if (d1 > d2)
     {
          MinDate = d2;
          MaxDate = d1;
     }
     if (d1 < d2)
     {
          MinDate = d1;
          MaxDate = d2;
     }
     while (MinDate != MaxDate)//           ,         
     {
              MinDate += 1;
              days++;//    
     }
     return days;
}

테스트 파일:
#include"date.h"
int main()
{
     Date d1(2016, 1, 7);
     Date d2(2016,1,3);
     Date d;
     int days = 100;
     d = d1 + days;
     cout << d1 <<" + "<< days <<": "<< d << endl;
     d = d1 - days;
     cout << d1 << " - " << days << ": " << d << endl;
     days = d1 - d2;
     cout <<d1 <<" - "<< d2<<": "<<days<< endl;
     getchar();
     return 0;
}

좋은 웹페이지 즐겨찾기