c++用类和对象来写 年,月,日 简单的 加,减以及比较大小遍历(完整代码)

经过前面的两篇博客,我们已经可以粗略的使用《构造函数》,《析构函数》,《拷贝构造函数》以及《赋值运算符的重载》来实现一个时间类的<<增,删>>,《比较大小两个日期的大小》,《一个日期减一个日期得到一个新的日期》,《一个日期减一个天数的大小》,《一个日期加一个天数》等等的简单实现,现在就来看一看下,这是在c++里面实现的。

首先,如果感觉自己能力比较强的同学,可以自己去实现一下,我先把日期类 《接口》给大家,看下面一段的代码;

#include"iostream"//(我这里面不能显示"<>"这个符号)
using namespace std;
class Date
{
public:
	int GetMonthDay(int year, int month)
	{
		int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; 
		if (month == 2 && ) //在这里还要判断是否为瑞年,
			return 29;
		else
			return monthArray[month];
	}
      // 四个成员函数
	Date(int year = 2019, int month = 1, int day = 1)
	{
		    if (year > 0 &&
			month > 0 && month < 13 &&
			day > 0 && day <= GetMonthDay(year, month))
		{
			      _year = year;
			    _month = month;
			   _day = day;
		}
		else
		{
			cout << "日期非法" << endl;
		}
	}
	//实现两个日期的一下接口,看是否相等,一个日期是否比另外一个大,等等!!!;
    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);
	// 给定一个日期实现前置(++,--);
	Date operator++();
	Date operator--();
   // 给定一个日期实现后置(++,--);
    Date operator++(int);
	Date operator--(int);
   //一个日期减一个日期, 
	int operator-(const Date& d);
void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2019, 2, 29);
	d1.Print();
   return 0;
}

接下来就看看我实现的代码:

    //#include<iostream>
    //using namespace std;
    //
    //class Date
    //{
    //public:
    //	int GetMonthDay(int year, int month)
    //	{
    //		int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    //		if (month == 2 && year%4 == 0 && year%100 != 0 || year%400 == 0) //我已经将他补充好了;
    //			return 29;
    //		else
    //			return monthArray[month];
    //	}
    //	// 四个成员函数
    //	Date(int year = 2019, int month = 1, int day = 31)
    //	{
    //		if (year > 0 &&
    //			month > 0 && month < 13 &&
    //			day > 0 && day <= GetMonthDay(year, month))
    //		{
    //			_year = year;
    //			_month = month;
    //			_day = day;
    //		}
    //		else
    //		{
    //			cout << "日期非法" << endl;
    //		}
    //	}
    //	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  true; 
    //		}
    //	if(_year < d._year)
    //	{
    //		return false;
    //	}
    //	if(_month > d._month )
    //		{
    //			return  true; 
    //		}
    //	if(_month  < d._month )
    //	{
    //		return false;
    //	}
    //	if(_day > d._day)
    //		{
    //			return  true; 
    //		}
    //	if(_day <= d._day)
    //	{
    //		return false;
    //	}
    //  }
    //	bool operator<(const Date& d) //判断一个日期是否小于另外一个;
    //	{
    //		if(_year < d._year)
    //		{
    //			return  true; 
    //		}
    //	if(_year > d._year)
    //	{
    //		return false;
    //	}
    //	if(_month < d._month )
    //		{
    //			return  true; 
    //		}
    //	if(_month  > d._month )
    //	{
    //		return false;
    //	}
    //	if(_day < d._day)
    //		{
    //			return  true; 
    //		}
    //	if(_day >= d._day)
    //	{
    //		return false;
    //	}
    //	}
    //	bool operator>=(const Date& d)
    //	{
    //		if(_year > d._year)
    //		{
    //			return  true; 
    //		}
    //	if(_year < d._year)
    //	{
    //		return false;
    //	}
    //	if(_month > d._month )
    //		{
    //			return  true; 
    //		}
    //	if(_month  < d._month )
    //	{
    //		return false;
    //	}
    //	if(_day > d._day)
    //		{
    //			return  true; 
    //		}
    //	if(_day < d._day)
    //	{
    //		return false;
    //	}
    //	else
    //		return  true;
    //}
    //	bool operator<=(const Date& d)
    //	{
    //		if(_year < d._year)
    //		{
    //			return  true; 
    //		}
    //	if(_year > d._year)
    //	{
    //		return false;
    //	}
    //	if(_month < d._month )
    //		{
    //			return  true; 
    //		}
    //	if(_month  > d._month )
    //	{
    //		return false;
    //	}
    //	if(_day < d._day)
    //		{
    //			return  true; 
    //		}
    //	if(_day > d._day)
    //	{
    //		return false;
    //	}
    //	else
    //		return true;
    //	}
    //	Date operator+(int day)   	//一个日期加上一个天数;
    //	{
    //		Date fur((*this));
    //		fur._day+=day;
    //	while(fur._day > GetMonthDay(fur._year,fur._month))
    //	{
    //		if(fur._month!=12)
    //		{
    //		fur._day = fur._day - GetMonthDay(fur._year,fur._month);
    //		fur._month++;
    //		}
    //		else
    //		{
    //		fur._day = fur._day-GetMonthDay(fur._year,12);
    //		fur._year++;
    //		fur._month = 1;
    //		}
    //	}
    //	return fur;		
    //}
    //	Date operator+=(int day) //一个日期加上一个固定天数;
    //	{
    //		_day += day;
    //	while(_day>GetMonthDay(_year,_month))
    //	{
    //		if(_month!=12)
    //		{
    //		_day = _day - GetMonthDay(_year,_month);
    //		_month++;
    //		}
    //		else
    //		{
    //		_day = _day-GetMonthDay(_year,12);
    //		_year++;
    //		_month = 1;
    //		}
    //		return (*this);
    //	}		
    //}
    //	Date operator-(int day)   //一个日期减上一个天数;
    //	{
    //		Date fur((*this));
    //		fur._day-=day;
    //	while(fur._day <= 0)
    //	{
    //
    //		if(fur._month == 1)
    //		{
    //		   fur._day = fur._day + GetMonthDay(fur._year,12);
    //		   fur._month = 12;
    //		   fur._year--;
    //		}
    //		else
    //		{
    //			fur._month -= 1;
    //		   fur._day = fur._day + GetMonthDay(fur._year,fur._month);
    //		}
    //	}
    //	return fur;		
    //}
    //	Date operator-=(int day)   //一个日期减上一个固定天数;
    //	{
    //	    _day -= day;
    //     while(_day <= 0)
    //	  {
    //
    //		if(_month == 1)
    //		{
    //		   _day = _day + GetMonthDay(_year,12);
    //		   _month = 12;
    //		   _year--;
    //		}
    //		else
    //		{
    //			_month -= 1;
    //		   _day = _day + GetMonthDay(_year,_month);
    //		}
    //	}
    //	return (*this);		
    //}
    //	Date& operator++()     //前置++
    //	{
    //	    (*this) += 1;
    //		return (*this);
    //	}
    //	Date operator--()      //前置--
    //	{
    //	     (*this) -= 1;
    //		 return (*this);
    //	}
    //	Date operator++(int)   //后置++
    //	{
    //		Date copy(*this);
    //		   (*this) += 1;
    //		return copy;
    //     }
    //	Date operator--(int)   //后置--
    //	{
    //		Date copy(*this);
    //	     (*this) -= 1;
    //		 return copy;
    //	}
    //int operator-(const Date& d) //一个日期减上一个日期;
    //{
    //	    int count = 0;
    //		Date copy(*this);
    //	if(copy<d)
    //	{
    //		while(copy!=d)
    //		{
    //		     copy++;
    //		     count--;
    //		}
    //	    return count;
    //	 }
    //	if(copy==d)
    //	{
    //		return 0;
    //	}
    //	if(copy>d)
    //	  {
    //		while(copy!=d)
    //		{
    //		   copy--;
    //		   count++;
    //		 }
    //		return count;
    //	   }
    //}
    //	void Print()
    //	{
    //		cout << _year << "-" << _month << "-" << _day << endl;
    //	}
   //private:
    //	int _year;
    //	int _month;
    //	int _day;
    //};
     //int main()
    //{
    //	/*Date d1(2019, 1 ,30);
    //	d1.Print();*/
    //	Date d;
    //	d.Print();
    //	Date d1(2018,1,25);
    //	d1.Print();
    //	(d1+8).Print();
    //	//d++;
    //	//d = (d-31);
    //    //d.Print();
    //    //d.operator -= (1);
    //	  //--d;
    //   /* d.Print();*/
    //
    //	//cout<<(d1 <= d)<<endl;
    //
    //	return 0;
    //}

(因为当时的需要,我把代码屏蔽了)在这里,我是每一个都实现了出来,大家是否感觉代码量非常的大,而且感觉很重复,那有没有什么简单方法,来减少我们的代码量?
答:那是肯定有的,我们想一想,如果我们在判断两个日期日期是否相等的时候,只实现 “<” 和 “==” 那么是不是其他运算符可以使用这两个来调用?比如举两个例子:我们现在要求比较两个日期的不相等,那么我们是否可以用《return !((*this) == d加粗样式)**》来使用,或者是比较一个日期是否大于等于另外一个日期,可以用《return !((*this) < d)》,来直接比较。

那么下来就看一下,我简化之后代码:

#include<iostream>
#include<assert.h>
using namespace std;
class Date
{
public:
     bool GetYear( int year)
	{
	     assert(year);
		 if((year%4 == 0 &&  year%100 != 0)
			 || year%400 == 0)
		 {
		       return true;
		 }
		 else
		 {
		      return   false;
		 }
	}
	int GetMonthDay(int year, int month)
	{
		const int monthArray[13] = { 0, 31, 28, 31, 30, 31, 30 ,31, 31, 30, 31,30, 31 };
		if (month == 2 && GetYear(year))
			return 29;
		else
			return monthArray[month];
	}
 // 四个成员函数
	Date(int year = 2019, int month = 1, int day = 1)
	{
		if (year > 0 &&
			month > 0 && month < 13 &&
			day > 0 && day <= GetMonthDay(year, month))
		{
			_year = year;
			_month = month;
			_day = day;
		}
		else
		{
			cout << "日期非法" << endl;
		}
	
	}
 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)
	{
	    return !((*this) < d && (*this) == d);	
	}
	bool operator<(const Date& d)
	{
	    if(_year < d._year )
		{
		    return true;
		}
		if(_year > d._year )
		{
		    return false;
		}
		if(_month < d._month )
		{
		    return true;
		}
		if(_month > d._month )
		{
		    return false;
		}
		if(_day < d._day )
		{
		    return true;
		}
		if(_day >= d._day )
		{
		    return false;
		}
	}
	bool operator>=(const Date& d) 
	{
	   return !((*this) < d);
	}
	bool operator<=(const Date& d)
	{
      return !((*this) > d);
	}
	Date operator+(int day)   //一个日期加上一个天数
	{
	      Date fur(*this);
		  fur._day += day;
		  while(fur._day > GetMonthDay(fur._year, fur._month))
		  {
		      if(fur._month !=12 )
			  {
			      fur._day = fur._day - GetMonthDay(fur._year, fur._month);
				  fur._month++;
			  }
			  else
			  {
                  fur._day = fur._day - GetMonthDay(fur._year, fur._month);
			      fur._year++;
				  fur._month = 1;
			  }
		  }
		  return fur;
	}
	Date operator+=(int day)  //一个日期加等上一个固定天数
	{
        _day += day;
		  while(_day > GetMonthDay(_year,_month))
		  {
		      if(_month !=12 )
			  {
			      _day = _day - GetMonthDay(_year,_month);
				  _month++;
			  }
			  else
                  _day = _day - GetMonthDay(_year, _month);
			      _year++;
				  _month = 1;
		  }
		  return (*this);   	    
	}
	Date operator-(int day)//一个日期减上一个天数
	{
	      Date fur(*this);
		  fur._day -= day;
		  while(fur._day < 1)
		  {
		      if(fur._month != 1)
			  {
			      fur._day = fur._day + GetMonthDay(fur._year, fur._month);
                  fur._month--;
			  }
			  else
			  {
                   fur._day = fur._day + GetMonthDay(fur._year, fur._month);
				   fur._year -= 1;
				   fur._month =12;
			  }     
		  }
		  return fur;
	}
	Date operator-=(int day)//一个日期减等一个固定的天数
	{
        _day -= day;
		  while(_day < 1)
		  {
		      if(_month != 1)
			  {
				  _month--;
			      _day = _day + GetMonthDay(_year, _month);
			  }
			  else
			  {
				   _year -= 1;
				   _month =12;
                   _day = _day + GetMonthDay(_year, _month);
			  }     
		  }
		  return (*this);	
 	}
	Date operator++()  前置++
	{
	     (*this)++;
		 return (*this);
	}
	Date operator--() //前置--
	{
	     (*this)--;
		 return (*this);
	}
	Date operator++(int) // 后置++
	{
	     Date copy(*this);
		 (*this)++;
		 return copy;
	}
	Date operator--(int) 后置--
	{
	    Date copy(*this);
		 (*this)--;
		 return copy;
	}
	int operator-(const Date& d) //一个日期减上一个日期
	{
	     int count =0;
		 Date copy(*this);
		 if(copy > d)
		 {
		      copy--;
			  count++;
		 }
		 if(copy == d)
		 {
		    return 0;
		 }
		 if(copy < d)
		 {
		     copy++;
			 count--;
         }
	}
void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};
void Test1()
{
       //Date d;
	//d.Print();
	//Date d1(2019, 1, 3);
 //   d1.Print();
	//cout<<(d <= d1)<<endl;
	/*Date d;
	d.Print();*/
	Date d1(2018,12,31);
	d1.Print();
	(d1+1).Print();
}
int main()
{
	Test1();
	return 0;
}

这样就可以简化我们一部分的代码量,我知道我这个还不是很好。如果有更好的意见,希望你们能够给我提一提,希望和大家共同进步,相互交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值