要重载一些运算符,最讨厌的就是减号了,不知道编的对不对,哪位好心的叔叔阿姨帮忙测试一下。
#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;
}