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

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

时间:2015-08-31 17:29:09      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:面试题   腾讯   万年历   

一、万年历类中所包含函数,以及功能

/******************************************************************************************

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);
Time(const Time& t);
Time& operator=(const Time& t);


private:
int _hour;
}


class Date
{
public:
// 初始化列表进行初始化。 
Date (int year = 1900, int month = 1, int day = 1);
Date (const Date& d);


Date& operator= (const Date& d);
void Display ();
public:
//
// 比较日期的运算符重载
//
bool operator == (const Date& d);
bool operator != (const Date& d);
bool operator > (const Date& d);
bool operator >= (const Date& d);
bool operator < (const Date& d);
bool operator <= (const Date& d);


//
// 计算一个日期加减一个天数以后的日期。
//
Date operator+(int day);
Date operator-(int day);
Date& operator-=(int day);
Date& operator+=(int day);


const Date& operator++(); // 前置++
Date operator++(int); // 后置++
const Date& operator--(); // 前置--
Date operator--(int); // 后置--


//
// 两个日期相加没有意义
// 计算两个日期相减以后的差的天数
//
int operator-(const Date& d);
private:
int _year;
int _month;
int _day;


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


二、代码

#include <iostream>
using namespace std;

class Time
{
public:
	Time(int hour=0,int minute=0,int second=0)
	{
		//cout<<"构函数"<<endl;
		_hour=hour;
		_minute=minute;
		_second=second;
	}

	friend class Date;

	Time(const Time& t)
	{
		//cout<<"copy构造函数"<<endl;
	}

	Time& operator=(const Time& t)
	{
		_hour = t._hour;
		_minute=t._minute;
		_second=t._second;

		return *this;
	}


private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
	// 初始化列表进行初始化
	//Date (int year = 1900, int month = 1, int day = 1,int hour=0):_t(hour)
	//{
	////	cout<<"构造函数"<<endl;
	//	_year = year;
	//	_month = month;
	//	_day = day;

	//	if (CheckDate() == false)
 //        {
 //           Date();
 //        }

	//}
	Date (int year = 1900, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		// 检查如果输入参数是非法时间,则初始化为1900-1-1
		if (CheckDate())
		{
			year = 1900;
			month = 1;
			day = 1;
		}
	}

	Date (const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		//cout<<"copy构造函数"<<endl;
	}

	Date& operator= (const Date& d)

	{
		_year=d._year;
		_month=d._month;
		_day=d._day;
		return *this;
	}

	void Display (Time& t)
	{
		cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
		cout<<t._hour<<":"<<t._minute<<":"<<t._second<<endl;
	}

	
public:
	
	//日期检查
	bool CheckDate ()
    {
          if (_year < 1
             || ( _month < 1 || _month > 12)
             || ( _day < 1   || _day > MonthDay(_year, _month )))
         { 
              return true ;
         }

          return false ;
    }

	//
	// 比较日期的运算符重载
	//
	bool operator == (const Date& d)
	{
		return(_year == d._year) && (_month == d._month) && (_day == d._day);
	}

	bool operator != (const Date& d)
	{
		return !(*this == d);
	}

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

	bool operator >= (const Date& d)
	{
		return ((*this==d)||(*this>d));
	}

	bool operator < (const Date& d)
	{
		return !(*this>=d);
		
	}

	bool operator <= (const Date& d)
	{
		return !(*this>d);
	}

	// 将日期转换为正确的日期
	//注意此函数功能多次用到,因此进行单个包装,用来减短代码长度!!!
	void _ToCrrectDate()
	{
		while(_day < 0)
		{
			_day += MonthDay (_year, _month);

			if (_month == 1)
			{
				_year--;
				_month = 12;
			}
			else
			{
				_month--;
			}
		}

		while (_day > MonthDay(_year, _month))
		{
			_day -= MonthDay (_year, _month);

			if (_month == 12)
			{
				_year++;
				_month = 1;
			}
			else
			{
				_month++;
			}
		}
	}


	//
	// 计算一个日期加减一个天数以后的日期。
	//
	Date operator+(int day)
	{
		Date tmp(*this);
		tmp._day+=day;
		tmp._ToCrrectDate();
									
		
		return tmp;
	}
	


	Date operator-(int day)
	{
		
			Date tmp(*this);
			tmp._day=tmp._day-day;
			tmp._ToCrrectDate();
			return tmp;
	}

	Date& operator-=(int day)
	{
		this->_day -= day;
		this->_ToCrrectDate();
		return *this;
	}

	Date& operator+=(int day)
	{
		this->_day += day;
		this->_ToCrrectDate();
		return *this;
	}

	const Date& operator++()	// 前置++
	{
		*this += 1;
		return *this;
		return *this;
	}

	Date operator++(int)		// 后置++		若没有加上(int),为何有如此多的错误
	{
		Date tmp(*this);
		*this += 1;
		return tmp;
	}

	const Date& operator--()	// 前置--
	{
		*this -= 1;
		return *this;
	}

	Date operator--(int)		// 后置--
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}
	//
	// 两个日期相加没有意义
	// 计算两个日期相减以后的差的天数
	//
	int operator-(const Date& d)
	{
		int flag = 1;			//标示量
		Date x1 = *this, x2 = d;
		if (x1 < x2)
		{
			flag = -1;
			x1 = d;
			x2 = *this;
		}
		
		int Days = 0;		//日期相差天数
		while (x1 != x2)
		{
			++x2;
			Days++;
		}

		return Days*flag;
	}

	int MonthDay(int year,int month)
	{
		if (year < 1 || month < 1 || month > 12)
		{
              return 0;
        }
		static int array[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};	//注意static的作用
		if(((year%4)&&(year%100)!=0)||(year%400==0))
		{
			array[2]=28;
		}
		return array[month];
	}
	
	friend ostream& operator<<( ostream& os , const Date& d );
	
    friend istream& operator>>( istream& is , Date& d);
 

private:
	int _year;
	int _month;
	int _day;

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


ostream& operator<<( ostream& os , const Date& d )
{
	os<<d._year<<"-";
	os<<d._month<<"-";
	os<<d._day;

     return os ;
}


istream& operator>>( istream& is , Date& d)
{
     cout<<" 请分别输入年月日: "<<endl ;
     is>>d._year;
     is>>d._month;
     is>>d._day;

     return is ;
}

void PromptInfo()
{
	cout<<"========日期计算器======="<<endl;
	cout<<"0.退出"<<endl;
	cout<<"1.推后几天的日期"<<endl;
	cout<<"2.计算日期差"<<endl;
	cout<<"3.清屏"<<endl;
	cout<<"========================="<<endl;
}


void main()
{
	Date d1, d2;
	int in, days;
	do {
		PromptInfo();
		cin>>in;

		switch(in)
		{
		case 0:
			break;
		case 1:
			cin>>d1;
			if (d1.CheckDate())
			{
				cout<<"输入日期非法!"<<endl;
				break;
			}
			cout<<"请出入计算推后的天数"<<endl;
			cin>>days;
			d1+=days;
			cout<<d1<<endl;
			break;
		case 2:
			cin>>d1;
			if (d1.CheckDate())
			{
				cout<<"输入日期非法!"<<endl;
				break;
			}
			cin>>d2;
			if (d2.CheckDate())
			{
				cout<<"输入日期非法!"<<endl;
				break;
			}
			days = d1 - d2;
			cout<<"相差的天数:"<<days<<endl;
			break;
		case 3:
			 system("CLS");
			 break ;
		default:
			cout<<"选项错误,请重新选择"<<endl;
			break;
		}
	}while(in != 0);
	getchar();
}




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

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

标签:面试题   腾讯   万年历   

原文地址:http://blog.csdn.net/zhangchaoq/article/details/48135553

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