年份的加減運算符重載C++Code

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

class CDate
{
 friend ostream &operator<<(ostream &os, const CDate &other);
public:
 CDate(int y = 0, int m = 0, int d = 0)
 {
  m_year = y;
  m_month = m;
  m_day = d;
 }
 bool IsLeapYear(int year); //判斷是否是閏年
 int DateToOn(const CDate &other); //日期轉換爲從0年0月0日起的天數
 int MonthDay(int year, int month); //當前月份有幾天
 CDate operator +(const CDate &other); //兩個日期相加
 int operator -(const CDate &other); //兩個日期相減的天數
 CDate operator +(int nday);  //當前日期加上nday天
 CDate operator -(int nday);  //當前日期減去nday天

private:
 int m_year;
 int m_month;
 int m_day;
};

bool CDate::IsLeapYear(int year)
{
 return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));
}

int CDate::DateToOn(const CDate &other)
{
 int sumday = 0;

 sumday = other.m_year * 365;

 for(int i = 1; i < other.m_year; ++i)
 {
  if(IsLeapYear(i))
  {
   sumday++;
  }
 }
 int sum_day;
 switch(other.m_month)  //計算本月一起共有多少天
 {
 case 1:
  sum_day = 0;
  break;
 case 2:
  sum_day = 31;
  break;
 case 3:
  sum_day = 59;
  break;
 case 4:
  sum_day = 90;
 case 5:
  sum_day = 120;
 case 6:
  sum_day = 151;
  break;
 case 7:
  sum_day = 181;
  break;
 case 8:
  sum_day = 212;
  break;
 case 9:
  sum_day = 243;
  break;
 case 10:
  sum_day = 273;
  break;
 case 11:
  sum_day = 304;
  break;
 case 12:
  sum_day = 334;
  break;
 default:
  printf("Date Error!!!/n");
 }
 sumday += sum_day;
 sumday += other.m_day;
 if(IsLeapYear(other.m_year) && other.m_month > 2)//當前年份是否是閏年
 {
  sumday ++;
 }
 return sumday;
}

int CDate::MonthDay(int year, int month)
{
 int curday = 0;
 bool leap = IsLeapYear(year);

 switch(month)
 {
 case 1:
 case 3:
 case 5:
 case 7:
 case 8:
 case 10:
 case 12:
  curday = 31;
  break;
 case 2:
  if(leap)
  {
   curday = 29;
  }
  else
  {
   curday = 28;
  }
  break;
 case 4:
 case 6:
 case 9:
  curday = 30;
  break;
 default:
  ;
 }
 return curday;
}

CDate CDate::operator+(const CDate &other)
{
 CDate temp;
 
 temp.m_year = this->m_year + other.m_year;
 temp.m_month = this->m_month + other.m_month;
 if(temp.m_month > 12)
 {
  temp.m_year ++;
  temp.m_month -= 12;
 }
 temp.m_day = this->m_day + other.m_day;
 if(temp.m_day > MonthDay(temp.m_year, temp.m_month)) //判斷當前天數是否大於本月的天數
 {
  temp.m_month ++;
  temp.m_day -= MonthDay(temp.m_year, temp.m_month);
 }
 return temp;
}

int CDate::operator-(const CDate &other)
{
 int disDay = 0;
 
 disDay = abs(DateToOn(other) - DateToOn(*this)); //調用DateToOn函數計算日期之差
 return disDay;
}

CDate CDate::operator+(int nday)
{
 int days = nday;
 int nyear = days / 365;

 CDate temp(nyear,0,0); //構造一個nyear的臨時對象

 days %= 365;
 for(int i=1; i<=nyear; ++i)//計算餘下一年內剩多少天
 {
  if(IsLeapYear(i))
  {
   days--;
  }
 }

 if(days > 0 && days <=31) //判斷幾月幾日
 {
  temp.m_month += 1;
  temp.m_day += days;
 }
 else if(days <= 59)
 {
  temp.m_month += 2;
  temp.m_day = days - 28;
 }
 else if(days <= 90)
 {
  temp.m_month += 3;
  temp.m_day = days - 59;
 }
 else if(days <= 120)
 {
  temp.m_month += 4;
  temp.m_day = days - 90;
 }
 else if(days <= 151)
 {
  temp.m_month += 5;
  temp.m_day = days - 120;
 }
 else if(days <= 181)
 {
  temp.m_month += 6;
  temp.m_day = days - 151;
 }
 else if (days <= 212)
 {
  temp.m_month += 7;
  temp.m_day = days - 181;
 }
 else if( days <= 243)
 {
  temp.m_month += 8;
  temp.m_day = days - 212;
 }
 else if (days <= 273)
 {
  temp.m_month += 9;
  temp.m_day = days - 243;
 }
 else if(days <= 304)
 {
  temp.m_month += 10;
  temp.m_day = days - 273;
 }
 else if (days <= 334)
 {
  temp.m_month += 11;
  temp.m_day = days - 304;
 }
 else
 {
  temp.m_month += 12;
  temp.m_day = days - 334;
 }
 
 CDate Dest = *this + temp; //調用兩個年份相加運算符構造最終對象
 return Dest;
}

CDate CDate::operator-(int nday)
{
 int days = nday;
 int nyear = days / 365;
 int nd = 0;

 //構造一個this->m_year- nyear - 1, this->m_month  , this->m_day的臨時對象
 CDate temp(this->m_year- nyear - 1, this->m_month, this->m_day );
 days %= 365;
 for(int i=1; i<=nyear; ++i)//計算餘下一年內剩多少天
 {
  if(IsLeapYear(i))
  {
   days--;
  }
 }
 if(IsLeapYear(this->m_year- nyear - 1)) //判斷多減去的那一年是否是閏年
 {
  nd = 366 - days;
 }
 else
 {
  nd = 365 - days;
 }
 CDate Dest = temp + nd; //調用加一個整形天數運算符重載函數計算最終CDate對象
 return Dest;
}

ostream &operator<<(ostream &os, const CDate &other)
{
 os << other.m_year << "--" << other.m_month << "--" << other.m_day;
 return os;
}

int main()
{
 CDate date1(1990, 5, 2);
 
 cout << "The first date object is :" << date1 << endl;
 cout << "The days between (0, 0, 0 ) and first date has :"
  <<date1.DateToOn(date1) << " days" << endl;
 
 CDate date2(1988, 4, 6);
 cout << "The second date object is :" << date2 << endl;
 cout << "The first date +  second date is : " << date1 + date2 << endl;
 cout << "The first date -  second date has: " << date1 - date2 << " days" <<endl;
 cout << "After The first date2 + 726 days the date is :" << date2 + 726 << endl;
 cout << "After The first date - 726 days the date is :" << date1 - 726 << endl;
 return 0;
}
/*
The first date object is :1990--5--2
The days between (0, 0, 0 ) and first date has :726985 days
The second date object is :1988--4--6
The first date +  second date is : 3978--9--8
The first date -  second date has: 726 days
After The first date2 + 726 days the date is :1990--5--2
After The first date - 726 days the date is :1988--6--7
請按任意鍵繼續. . .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章