码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】万年历的实现

时间:2015-08-25 21:40:52      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:c++   class   

/******************************************************************************************
Date.hpp:
	Copyright (c) Bit Software, Inc.(2013), All rights reserved.

Purpose:
	声明并实现一个万年历类【腾讯面试题】

Author:
	xxx

Created Time:
	2015-4-26
******************************************************************************************/
class Time
{
public:
	Time(int hour = 1)
	{
		_hour = hour;
	}
	Time(const Time& t)
	{
		_hour = t._hour;
	}
	Time& operator=(const Time& t)
	{
		this->_hour = t._hour;
		return *this;
	}

private:
	int _hour;
};

class Date
{
public:
	// 初始化列表进行初始化。 
	Date (int year = 1900, int month = 1, int day = 1, const Time& t = 1)
	:_year(year)
	,_month(month)
	,_day(day)
	,_t(t)
	{}

	Date (const Date& d)
	:_year(d._year)
	,_month(d._month)
	,_day(d._day)
	,_t(d._t)
	{}

	Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		_t = d._t;
		return *this;
	}
	void Display ()
	{
		cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
	}
public:
	//
	// 比较日期的运算符重载
	//
	bool operator == (const Date& d)
	{
		return _year == d._year && _month == d._month
			&& _day ==d._day;
	}
	bool operator != (const Date& d)
	{
		return _year != d._year || _month != d._month
			|| _day !=d._day;
	}
	bool operator > (const Date& d)
	{
		if(_year>d._year )
		{
			return 1;
		}
		else if(_year<d._year )
		{
			return 0;
		}
		else 
		{
			if (_month > d._month )
			{
				return 1;
			}
			else if (_month < d._month )
			{
				return 0;
			}
			else
			{
				if(_day > d._day )
				{
					return 1;
				}
				
				else 
				{
					return 0;
				}
			}
		}
		return 0;
	}
	bool operator >= (const Date& d)
	{
			if(_year>d._year )
		{
			return 1;
		}
		else if(_year<d._year )
		{
			return 0;
		}
		else 
		{
			if (_month > d._month )
			{
				return 1;
			}
			else if (_month < d._month )
			{
				return 0;
			}
			else
			{
				if(_day >= d._day )
				{
					return 1;
				}
				else 
				{
					return 0;
				}
			}
		}
		return 0;
	}

	bool operator < (const Date& d)
		{
		if(_year<d._year )
		{
			return 1;
		}
		else if(_year>d._year )
		{
			return 0;
		}
		else 
		{
			if (_month < d._month )
			{
				return 1;
			}
			else if (_month > d._month )
			{
				return 0;
			}
			else
			{
				if(_day < d._day )
				{
					return 1;
				}
				
				else 
				{
					return 0;
				}
			}
		}
		return 0;
	}
	bool operator <= (const Date& d)
			{
		if(_year<d._year )
		{
			return 1;
		}
		else if(_year>d._year )
		{
			return 0;
		}
		else 
		{
			if (_month < d._month )
			{
				return 1;
			}
			else if (_month > d._month )
			{
				return 0;
			}
			else
			{
				if(_day <= d._day )
				{
					return 1;
				}
				
				else 
				{
					return 0;
				}
			}
		}
		return 0;
	}

	//
	// 计算一个日期加减一个天数以后的日期。
	//
	
	int GetMonDay(int year,int month)
	{
		static int array[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
		if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
		{
			array[2] = 29; 
		}
	return array[month];
	}
	
	Date operator+(int day)
	{
		Date tmp(*this);
		tmp._day += day;
		while(tmp._day > GetMonDay(tmp._year,tmp._month))
		{
			tmp._day -= GetMonDay(tmp._year,tmp._month);
			if(tmp._month ==12)
			{
				++tmp._year;
				tmp._month = 1;
			}
			else
				tmp._month ++;
		}
		return tmp;
	}
	
	Date operator-(int day)
	{
		Date tmp(*this);
		tmp._day -= day;
		while(tmp._day < 1)
		{   
			if(tmp._month ==1)
			{
				tmp._month = 12;
				tmp._year --;
				tmp._day += 31;
			}
			else {
				tmp._month --;
				tmp._day += GetMonDay(tmp._year,tmp._month);
			}
			
		}
		return tmp;
	}
	Date& operator-=(int day)
	{
		_day -= day;
		while(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day += GetMonDay(_year,_month);
			}
		}
		return *this;
	}
	Date& operator+=(int day)
	{
		_day += day;
		while(_day > GetMonDay(_year,_month))
		{
			_day = _day - GetMonDay(_year,_month);
			if(_month == 12)
			{
				_year++;
				_month = 1;
				
			}
			else
			{
				_month++;
			}
		}
		return *this;
	}

	const Date& operator++()	// 前置++
	{
		_day++;
		if(_day > GetMonDay(_year,_month))
		{
			if(_month == 12)
			{
				_year++;
				_month = 1;
				_day = 1;
			}
			else
			{
				_month++;
			    _day =1;
			}
		}
		return *this;
	}
	Date operator++(int)		// 后置++
	{
		Date tmp(*this);
		_day ++;
		if(_day > GetMonDay(_year,_month))
		{
			if(_month ==12)
			{
				_year++;
				_month = 1;
				_day =1;
			}
			else
			{
				_month ++;
				_day =1;
			}
		}
		return tmp;
	}
	const Date& operator--()	// 前置--
	{
		_day--;
		if(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day = 31;
			}
			else
			{
				_month--;
				_day = GetMonDay(_year,_month);
			}
		}
		return *this;
	}
	Date operator--(int)		// 后置--
	{
		Date tmp(*this);
		_day --;
		if(_day < 1)
		{
			if(_month == 1)
			{
				_year--;
				_month = 12;
				_day = 31;
			}
			else
			{
				_month--;
				_day = GetMonDay(_year,_month);
			}
			return tmp;
		}

	}
	//
	// 两个日期相加没有意义
	// 计算两个日期相减以后的差的天数
	//
	int operator-(const Date& d)
	{
		if(*this > d)
		{   
			Date d1 = d;//xiao
			Date d2 =*this;//da
		}
	}
private:
	int _year;
	int _month;
	int _day;

	//const int _testConst;
	//int& _testRef;
	Time _t;
};

void TestDate()
{
	Date d1(2015,1,1);
	d1.Display ();
	//Date d2(2015,8,18);
	//d2.Display();
	/*int ret = (d1==d2);
	cout<<ret<<endl;
	int ret = (d1!=d2);
	cout<<ret<<endl;
	int ret = (d1<=d2);
	cout<<ret<<endl;*/
    d1+=40;
	d1.Display();

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【C++】万年历的实现

标签:c++   class   

原文地址:http://blog.csdn.net/liuxiaoqian_/article/details/47983403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!