C++下的Date类编写

Date类的编写要求如下,编写构造函数以及运算符的重载,以及测试基础代码

class Date

{                                      
public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
// 如何检查一个日期是否合法
int days = GetMonthDays(year, month);
if (days == -1 || day < 1 || day > days)
{
cout<<"日期不合法"<<endl;
Display();
exit(-1);
}
}

//d1 > d2
bool operator>(const Date& d);
//operator>=
//operator<
//operator<=
//operator==
//operator!=

//d1 + 100
Date operator+(int day);
Date operator+=(int day);
Date operator-(int day);
Date operator-=(int day);
Date operator++();
Date operator++(int);
Date operator--();
Date operator--(int);
int operator-(const Date& d);

bool IsLeapYear(int year);
// if /switch/array
int GetMonthDays(int year, int month);
private:
int _year;
int _month;
int _day;

};                    


代码如下:这份代码的两个日期相减部分在最后做了优化,第一次代码太过于繁琐,可以使用代码复用进行优化。

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		// 如何检查一个日期是否合法 
		int days = GetMonthDays(year, month);
		if (days == -1 || day < 1 || day > days)
		{
			cout << "日期不合法" << endl;
			this->Display();
			//exit(-1);
		}
	}
	void Display()const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	//d1 > d2 
	bool operator>(const Date& d)                //>
	{
		if (this->_year > d._year)
		{
			return true;
		}
		else if (this->_year == d._year)
		{
			if (this->_month > d._month)
			{
				return true;
			}
			else if (this->_month == d._month)
			{
				if (this->_day > d._day)
				{
					return true;
				}
			}
		}
		return false;
	}
	
	static bool IsLeapYear(int year)
	{
		if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		{
			return true;
		}
		return false;
	}
	inline static int GetMonthDays(int year, int month)
	{
		if (year < 1900 || month<1 || month>12)
		{
			return -1;
		}
		static int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		int days = arr[month];
		if ((month == 2) && (IsLeapYear(year)))
		{
			days += 1;
		}
		return days;
	}
	//operator>= 
	bool operator >=(const Date& d)              //>=
	{
		return (*this>d)||(*this==d);
	}
	//operator< 
	bool operator<(const Date& d)                //<
	{
		return !(*this>= d);
	}
	//operator<= 
	bool operator<=(const Date& d)              //<=
	{
		return (*this < d || *this == d);
	}
	//operator== 
	bool operator==(const Date& d)              //==
	{
		return _year == d._year
			&& _month == d._month
			&& _day == d._day;
	}
	//operator!= 
	bool operator!=(const Date& d)              //!=
	{
		return !(*this == d);
	}

	bool IsInvalid()
	{
		if (_year < 1900 || _month<1 || _month>12 || _day<1 || _day>GetMonthDays(_year, _month))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	//d1 + 100 
	Date operator+(int day)                        //+
	{
		if (day < 0)
		{
			return *this - (-day);
		}
		Date tmp(*this);
		tmp._day += day;
		while (tmp.IsInvalid())
		{
			tmp._day -= GetMonthDays(tmp._year, tmp._month);
			tmp._month++;
			if (tmp._month == 13)
			{
				tmp._year++;
				tmp._month = 1;
			}
		}
		return tmp;
	}
	Date operator+=(int day)                     //+=
	{
		if (day < 0)
		{
			return *this -= (-day);
		}
		_day += day;
		while (IsInvalid())
		{
			_day -= GetMonthDays(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		return *this;
	}
	Date operator-(int day)                //-
	{
		if (day < 0)
		{
			return *this + (-day);
		}
		Date tmp(*this);
		tmp._day -= day;
		while (tmp.IsInvalid()==true)
		{
			if (tmp._month == 1)
			{
				tmp._year--;
				tmp._month = 12;
			}
			else
			{
				tmp._month--;
			}
			tmp._day += tmp.GetMonthDays(tmp._year, tmp._month);
			
		}
		return tmp;
	}
	Date operator-=(int day)             //-=
	{
		if (day < 0)
		{
			return *this += (-day);
		}
		_day -= day;
		while (IsInvalid() == true)
		{
			if (_month == 1)
			{
				_year--;
				_month = 12;
			}
			else
			{
				_month--;
			}
			_day += GetMonthDays(_year, _month);

		}
		return *this;
	}

	Date operator++()          //前置++
	{
		*this+=1;
		return *this;
	}
	Date operator++(int)          //后置++
	{
		Date tmp(*this);
		*this+=1;
		return tmp;
	}
	Date operator--()               //前置--
	{
		*this -= 1;
		return *this;
	}
	Date operator--(int)             //后置--
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}
	int operator-(const Date& d)        //一个日期减去一个日期,相差多少天
	{                                   //将两个日期分别与初始定义的1900-1-1相减,得到两个天数再相减
		int Leapyearday = 366;
		int Noleapyearday = 365;
		Date chushi;
		Date tmp1(*this);
		int day1 = tmp1._day ;
		while (tmp1._month >chushi._month)
		{
			tmp1._month--;
			day1 += tmp1.GetMonthDays(tmp1._year, tmp1._month);
		}
		while (tmp1._year >chushi._year)
		{
			tmp1._year--;
			if (tmp1.IsLeapYear(tmp1._year))
			{
				day1 += Leapyearday;
			}
			else
			{
				day1 += Noleapyearday;
			}
		}
		Date tmp2(d);
		int day2 = tmp2._day;
		while (tmp2._month >chushi._month)
		{
			tmp2._month--;
			day2 += tmp2.GetMonthDays(tmp2._year, tmp2._month);
		}
		while (tmp2._year > chushi._year)
		{
			tmp2._year--;
			if (tmp2.IsLeapYear(tmp2._year))
			{
				day2 += Leapyearday;
			}
			else
			{
				day2 += Noleapyearday;
			}
		}

		int day = day1 - day2;
		return day;
	}
private:
	int _year;
	int _month;
	int _day;
};
 

测试用例:

void test()
{
	Date d1;
	Date d2(1996, 7, 1);
	d1.Display();
	d2.Display();
	cout << d1.operator==(d2)<< endl;
	cout << d1.operator<=(d2) << endl;
	cout << d1.operator>=(d2) << endl;
	cout << d1.operator!=(d2) << endl;
	cout << d1.operator<(d2) << endl;
	cout << d1.operator>(d2) << endl;

}
void test1()
{
	Date d1(1996, 8, 6);
	Date d3 = ++d1;
	d3.Display();
	d3 = d1++;
	d3.Display();
	d1.Display();
	d3 = d1 + 1000;
	d3.Display();
	d1 += 1000;
	d1.Display();

}

void test2()
{
	Date d1(1996, 8, 6);
	Date d3 = d1 - 1000;
	d3.Display();
	d1.Display();
	d1 -= 1000;
	d1.Display();
}

void test3()
{
	Date d1(1996,8,6);
	d1.Display();
	Date d3 = d1--;
	d3.Display();
	d1.Display();
	d3 = --d1;
	d3.Display();
	d1.Display();
}
void test4()
{
	Date d1(1996, 8, 6);
	Date d2(1994, 7, 1);
	int days = d2 - d1;
	cout << days << endl;
}


从test()到test4()运行结果:

 
 

 
 

 
 
 
 


两个日期相减的代码优化:

int operator-(const Date& d)        //一个日期减去一个日期,相差多少天
	{                                   //比较两个日期的大小,让小的日期做前置++运算,每次增加一天,直到和大的日期相等
                Date min = d;               //增加的天数,就是相差的天数
		Date max = *this;
		int flags = 1;          //flags是标志位,大日期减小日期天数为正,反之为负
		int count = 0;
		if (*this < d)
		{
			min = *this;
			max = d;
			flags = -1;
		}
		while (min != max)
		{
			++min;
			++count;
		}
		return count*flags;
	}














  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值