日期计数器—C++实现

日期计数器实现:在程序中定义日期类: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值