日期计数器实现:在程序中定义日期类:class Date{};,主要运用操作符重载知识在其中实现:日期加或减一定天数,日期减日期相差天数,两日期的各种比较与日期输入输出等功能。
具体代码实现:
#include <iostream>
#include <cstdlib>
using namespace std;
class Data
{
friend ostream& operator<<(ostream& _cout, const Data& d);
friend istream& operator>>(istream& _cin, Data& d);
public:
Data(const int year=1900,const int month=1,const int day=1)
:_year(year)
,_month(month)
,_day(day)
{}
Data(const Data& data)
{
_year=data._year;
_month=data._month;
_day=data._day;
}
~Data()
{}
int GetDaysInMonth(int year,int month); //获取每个月的天数
bool isLeapYear(int year); //判断闰年
bool isValiData(); //判断日期是否合法
Data & operator =(const Data &d);
Data operator+(int day);
Data operator -(int day);
int operator -(const Data &d);
Data &operator --();
Data operator --(int);
Data &operator ++();
Data operator ++(int);
bool operator >(const Data &d);
bool operator <(const Data &d);
bool operator >=(const Data &d);
bool operator <=(const Data &d);
bool operator ==(const Data &d);
bool operator !=(const Data &d);
private:
int _year;
int _month;
int _day;
};
bool Data::isLeapYear(int year) //判断闰年
{
return ((year%4==0)&&(year%100!=0))||(year%400==0)?true:false;
}
bool Data::isValiData() //判断日期是否合法
{
if((_year>=1900)&&((_month>0)&&(_month<13))&&
((_day<=GetDaysInMonth(_year,_month))&&(_day>0)))
{
return true;
}
return false;
}
int Data::GetDaysInMonth(int year,int month) //获取每个月的天数
{
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)&&(month==2))
{
days[month]++;
}
return days[month];
}
ostream& operator<<(ostream& _cout, const Data& d)
{
_cout<<d._year<<"-"<<d._month<<"-"<<d._day;
return _cout;
}
istream& operator>>(istream& _cin, Data& d)
{
_cin>>d._year>>d._month>>d._day;
return _cin;
}
Data & Data:: operator =(const Data &d)
{
if(this != &d)
{
_year=d._year;
_month=d._month;
_day=d._day;
}
return *this;
}
Data Data::operator+(int day)
{
if(day<0)
{
day=0-day;
return *this-day;
}
Data tmp(*this);
tmp._day+=day;
while(tmp._day>GetDaysInMonth(tmp._year,tmp._month))
{
tmp._day-=GetDaysInMonth(tmp._year,tmp._month);
tmp._month++;
if(tmp._month==13)
{
tmp._month=1;
tmp._year++;
}
}
return tmp;
}
Data Data:: operator -(int day)
{
if(day<0)
{
day=0-day;
return *this+day;
}
Data tmp(*this);
tmp._day-=day;
while(tmp._day<=0)
{
tmp._month--;
if(tmp._month==0)
{
tmp._month=12;
tmp._year--;
}
tmp._day+=GetDaysInMonth(tmp._year,tmp._month);
}
return tmp;
}
int Data::operator -(const Data &d)
{
int count=0;
if(*this>d)
{
Data tmp=d;
while(tmp!=*this)
{
tmp++;
count++;
}
return count;
}
else
{
Data tmp=*this;
while(tmp!=d)
{
tmp++;
count++;
}
return count;
}
}
Data & Data::operator ++() //前置++
{
_day+=1;
if(_day>GetDaysInMonth(_year,_month))
{
_month++;
if(_month==13)
{
_year++;
_month=1;
}
_day=1;
}
return *this;
}
Data Data::operator ++(int) //后置++
{
Data tmp=*this;
_day+=1;
if(_day>GetDaysInMonth(_year,_month))
{
_month++;
if(_month==13)
{
_year++;
_month=1;
}
_day=1;
}
return tmp;
}
Data & Data::operator --() //前置--
{
_day-=1;
if(_day==0)
{
_month--;
if(_month==0)
{
_year--;
_month=12;
}
_day=GetDaysInMonth(_year,_month);
}
return *this;
}
Data Data::operator --(int) //后置--
{
Data tmp=*this;
_day-=1;
if(_day==0)
{
_month--;
if(_month==0)
{
_year--;
_month=12;
}
_day=GetDaysInMonth(_year,_month);
}
return tmp;
}
bool Data::operator >(const Data &d)
{
if(_year>d._year)
{
return true;
}
else if(_year==d._year)
{
if(_month>d._month)
{
return true;
}
else if(_month==d._month)
{
if(_day>d._day)
{
return true;
}
}
}
return false;
}
bool Data::operator <(const Data &d)
{
if(_year<d._year)
{
return true;
}
else if(_year==d._year)
{
if(_month<d._month)
{
return true;
}
else if(_month==d._month)
{
if(_day<d._day)
{
return true;
}
}
}
return false;
}
bool Data::operator >=(const Data &d)
{
return !(*this<d);
}
bool Data::operator <=(const Data &d)
{
return !(*this>d);
}
bool Data::operator ==(const Data &d)
{
return (_year==d._year)&&(_month==d._month)&&(_day==d._day);
}
bool Data::operator !=(const Data &d)
{
return !(*this==d);
}
//测试函数
void test1()
{
Data d1(2016,9,30);
Data d2(2016,10,6);
d1=d2;
d2=d2+999;
d1=d1-999;
Data d=--d2;
d=d2--;
Data d3(2016,9,30);
Data d4(2001,10,6);
int ret=d3-d4;
cout<<ret<<endl;
}
void test2()
{
Data d1(2016,11,8);
Data d2(2016,11,7);
if(d1>d2)
{
cout<<"d1>d2"<<endl;
}
Data d3(2016,11,6);
Data d4(2016,11,7);
if(d3<d4)
{
cout<<"d3<d4"<<endl;
}
Data d5(2016,11,9);
Data d6(2016,11,7);
if(d5>=d6)
{
cout<<"d5>=d6"<<endl;
}
Data d7(2016,10,6);
Data d8(2016,10,21);
if(d7<=d8)
{
cout<<"d7<=d8"<<endl;
}
Data d9(2016,11,6);
Data d0(2016,11,6);
if(d9==d0)
{
cout<<"d9==d0"<<endl;
}
Data da(2016,11,6);
Data db(2016,11,7);
if(da!=db)
{
cout<<"da!=db"<<endl;
}
}
void test3()
{
Data d1(2016,3,2);
cin>>d1;
cout<<d1<<endl;
}
int main()
{
test1();
test2();
test3();
system("pause");
return 0;
}