Data.cpp老师的作业,叫咱编写一个存放日期的data类

要重载一些运算符,最讨厌的就是减号了,不知道编的对不对,哪位好心的叔叔阿姨帮忙测试一下。

#include <iostream>
using std::cout; 
using std::ostream;
using std::istream;
using std::endl;
using std::cin;

class Data
{
private:
 int year;
 int mouth;
 int day;
public:
    Data ():year(2000),mouth(1),day(1){};
 Data (int, int, int);
 void set(int, int, int);
 void get(int &, int &, int &);
 void show();
 Data operator + (int);
 Data operator - (int);
 int operator - (Data &);
 Data operator ++ ();
 Data operator ++ (int);
 Data operator -- ();
 Data operator -- (int);
 friend ostream & operator << (ostream &, Data &);
 friend istream & operator >> (istream &, Data &);
 bool operator == (Data &);
 bool operator != (Data &);
 bool operator < (Data &);
 bool operator > (Data &);
 bool operator <= (Data &);
 bool operator >= ( Data &);
 friend int max(int, int);
};

inline int max(int x,int y)
{
 return (x>=y)?x:y;
}

int l1[13] = {31,31,28,31,30,31,30,31,31,30,31,30,31};   //贫年12月,1月...12月;数组第一个放12月在重载“-”号可方便编写
int l2[13] = {31,31,29,31,30,31,30,31,31,30,31,30,31};   //闰年12月,1月...12月

/*****************************************************
                       构造函数
*****************************************************/

Data :: Data (int x, int y, int z)                    //构造函数
{
 if (x<1900 || x>2099)
  year = 2000;
 else year = x;
 if (y<1 || y>12)
  mouth = 1;
 else mouth = y;
    if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (z<1 || z > l2[mouth])
   day = 1;
  else day = z;
 }
 else
 {
  if (z<1 || z > l1[mouth])
   day = 1;
  else day = z;
 }
}

/***********************************************************
                           set函数
************************************************************/

void Data :: set(int x = 2000, int y = 1, int z = 1)     //set函数
{
 if (x<1900 || x>2099)
  year = 2000;
 else year = x;
 if (y<1 || y>12)
  mouth = 1;
 else mouth = y;
    if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (z<1 || z > l2[mouth])
   day = 1;
  else day = z;
 }
 else
 {
  if (z<1 || z > l1[mouth])
   day = 1;
  else day = z;
 }
}

/**********************************************
                get函数
***********************************************/
void Data :: get(int &x, int &y, int &z)                  //get函数
{
 x = year;
 y = mouth;
 z = day;
}

/**********************************************
                show函数
***********************************************/

void Data :: show ()                                              //show函数
{
 cout << year << "年" << mouth << "月" << day << "日" << endl;
}


/**********************************************
            重载运算符(Data)+int
***********************************************/
Data Data :: operator + (int x)                             //重载运算符Data+int
{
 Data r;
 r.day = day + x;
 r.year = year;
 r.mouth = mouth;
 if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
 {
loop1: while (1)
  {
      if (r.day > l2[r.mouth])
   {
       r.day -= l2[r.mouth];
       r.mouth ++;
       if (r.mouth >12)
    {
        r.mouth -=12;
        r.year ++;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop1;
     else goto loop2;
    }
   }
   else break;
  }
 }
 
 else
 {
loop2: while (1)
  {
      if (r.day > l1[r.mouth])
   {
       r.day -= l1[r.mouth];
       r.mouth ++;
       if (r.mouth >12)
    {
        r.mouth -=12;
        r.year ++;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop1;
     else goto loop2;
    }
   }
   else break;
  }
 }
return r;
}


/**********************************************
             重载(Data)-int
***********************************************/

Data Data :: operator - (int x)                                    //重载Data-int
{
 Data r;
 r.day = day -x;
 r.mouth = mouth;
 r.year = year;
 if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
 {
loop3: while (1)
  {
   if (r.day < 1)
   {
    r.day += l2[r.mouth-1];
    r.mouth--;
    if (r.mouth < 1)
    {
     r.mouth += 12;
     r.year --;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop3;
     else goto loop4;
    }
   }
   else break;
  }
 }
 else
 {
loop4: while (1)
  {
   if (r.day < 1)
   {
    r.day += l2[r.mouth-1];
    r.mouth--;
    if (r.mouth < 1)
    {
     r.mouth += 12;
     r.year --;
     if ((r.year%4==0 && r.year%100 !=0) || (r.year%400==0))
      goto loop3;
     else goto loop4;
    }
   }
   else break;
  }
 }
 return r;
}


/**********************************************
            重载 (Data)-(Data)
***********************************************/
int Data :: operator - (Data &x)                        //重载两Data-Data
{                                                       //方法:将Data x升降至Data this所经过的日期,先降升年,再降升月,再降升日。
 int r =0;
 int i, t = max(year,x.year);
 r = day - x.day;                                    //计算日差

 if (mouth > x.mouth)                                           //计算月差开始
 {
  if ((t==0 && t%100 !=0) || t%400==0)
      for (i = x.mouth; i<mouth; i++)
       r += l2[i];
  else
   for (i = x.mouth; i<mouth; i++)
    r += l1[i];
 }
 else
 {
  if ((t==0 && t%100 !=0) || t%400==0)
      for (i = mouth; i < x.mouth; i++)
       r -= l2[i];
  else
   for (i = mouth; i < x.mouth; i++)
       r -= l1[i];
 }                                                             //计算月差结束

 if (year > x.year)                                       //计算年差开始
 {
  for (i=x.year; i<year; i++)
  {
   if ((i%4==0 && i%100 !=0) || (i%400==0))
       r += 366;
   else
    r += 365;
  }
 }
 else
 {
  for (i=year; i < x.year; i++)
  {
   if ((i%4==0 && i%100 !=0) || (i%400==0))
       r -= 366;
   else
    r -= 365;
  }
 }                                                         //计算年差结束
 return r;     //好难,其实应该先计算年差,再算月差,再算日差,不过因为日差比较简单,所以放在最前,不影响结果。
}


/**********************************************
                重载 ++(Data)
***********************************************/
Data Data :: operator ++ ()                                   //重载++Data
{
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (++day > l2[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
    else
 {
  if (++day > l1[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
 return *this;
}


/**********************************************
                重载 (Data)++
***********************************************/
Data Data :: operator ++ (int)                          //重载Data++
{
 Data temp(* this);
 day ++;
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (day > l2[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
    else
 {
  if (day > l1[mouth])
  {
   day = 1;
   ++mouth;
  }
  if (mouth > 12)
  {
   mouth =1;
   ++year;
  }
 }
 return temp;
}


/**********************************************
                重载  --(Data)
***********************************************/
Data Data :: operator -- ()                             //重载--Data
{
 day --;
 if ((year%4==0 && year%100 !=0) || (year%400==0))
 {
  if (day < 1)
  {
   mouth--;
   day = l2[mouth];
  }
  if (mouth < 1)
  {
   year--;
   mouth = 12;
  }
 }
 else
 {
  if (day < 1)
  {
   mouth--;
   day = l1[mouth];
  }
  if (mouth < 1)
  {
   year--;
   mouth = 12;
  }
 }
 return *this;
}


/**********************************************
              重载 (Data)--
***********************************************/
Data Data:: operator -- (int)                                          //重载Data--
{
 Data temp(*this);
 day--;
 if (day < 1)
 {
  mouth--;
  if ((year%4==0 && year%100 !=0) || (year%400==0))
   day = l2[mouth];
  else
   day = l1[mouth];
 }
 if (mouth < 1)
 {
  mouth = 12;
  year --;
 }
 return temp;
}


/**********************************************
               重载 << (Data)
***********************************************/
ostream & operator << (ostream &output, Data &x)                          //重载<<
{
 output << x.year << "年" << x.mouth << "月" << x.day << "日" << endl;
 return output;
}


/**********************************************
               重载 >> (Data)
***********************************************/
istream & operator >> (istream &input, Data &x)                           //重载>>
{
 input >> x.year >> x.mouth >> x.day;
 return input;
}

/**********************************************
               重载 (Data)==(Data)
***********************************************/
bool Data :: operator == (Data &x)                                         //重载==
{
 bool r = false;
 if (year == x.year && mouth == x.mouth && day == x.day)
  r = true;
 return r;
}


/**********************************************
               重载 (Data)!=(Data)
***********************************************/
bool Data :: operator != (Data &x)                                        //重载!=
{
 bool r = true;
 if (year == x.year && mouth == x.mouth && day == x.day)
  r = false;
 return r;
}

/**********************************************
               重载 (Data)<(Data)
***********************************************/
bool Data :: operator < (Data &x)                                     //重载<
{
 bool r = true;
 if (year > x.year)
  r = false;
 if (year == x.year && mouth > x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day >= x.day)
  r = false;
 return r;
}

/**********************************************
               重载 (Data)>(Data)
***********************************************/
bool Data :: operator > (Data &x)                                     //重载>
{
 bool r = true;
 if (year < x.year)
  r = false;
 if (year == x.year && mouth < x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day <= x.day)
  r = false;
 return r;
}


bool Data :: operator <= (Data &x)                           //重载<=
{
 bool r = true;
 if (year > x.year)
  r = false;
 if (year == x.year && mouth > x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day > x.day)
  r = false;
 return r;
}

bool Data :: operator >= (Data &x)                            //重载>=
{
 bool r = true;
 if (year < x.year)
  r = false;
 if (year == x.year && mouth < x.mouth)
  r = false;
 if (year == x.year && mouth == x. mouth && day < x.day)
  r = false;
 return r;
}

int main()
{
 cout << "please test the program" << endl;
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值