/******************************************************************************************
date.hpp:
Copyright (c) Bit Software, Inc.(2013), All rights reserved.
Purpose:
声明并实现一个日期类
难度:***
Author:
xxx
Created Time:
2015-4-26
******************************************************************************************/
#ifndef DATE_HPP_INCLUDED
#define DATE_HPP_INCLUDED
#include <iostream>
using namespace std;
class Date
{
public:
Date (int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
// 检查如果输入参数是非法时间,则初始化为1990-1-1
if (check_is_valid_date () == false)
{
year = 1990;
month = 1;
day = 1;
}
}
Date (const Date& d)
:_year(d._year)
,_month(d._month)
,_day(d._day)
{}
// 思考为什么operator=赋值函数需要一个date&的返回值??
Date& operator= (const Date& d)
{
if (this != &d)
{
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
}
return *this;
}
~Date()
{}
// 检查时间是否有效
bool check_is_valid_date ()
{
if (_year < 1
|| (_month < 1 || _month > 12)
|| (_day < 1 || _day > day_of_month (_year, _month)))
{
return false;
}
return true;
}
void display ()
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl<<endl;
}
public:
// static修饰成员函数是静态成员函数,不明白的查一下资料!
// 返回一个月的天数,日期非法则返回0
// 这个函数这是一种优化的思路,你还有其他的逻辑思路吗?请实现!
static int day_of_month (int year, int month)
{
if (year < 1 || month < 1 || month > 12) {
return 0;
}
int month_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 瑞年的2月是29天
month_days[2] += is_leap_year(year);
return month_days[month];
}
// 判断是否为瑞年。
// 另外请思考为什么瑞年是这样计算,而不直接是year % 4 == 0就是瑞年???
static bool is_leap_year (int year)
{
if ((year % 4 == 0 && year % 100 != 0)
|| year % 400 == 0)
{
return true;
}
return false;
}
// 请实现下面的运算符重载
public:
// 计算日期 +/- 一定天数以后的日期
Date operator+(int day)
{
if( (_day+day) > day_of_month(_year,_month) )
{
_month = _month+1;
_day = day - (day_of_month(_year,_month) - _day) + 1;
if(_day == 0)
{
_day += 1;
}
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
else
{
_day=_day+day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
return Date(_year,_month,_day);
}
Date& operator+=(int day)
{
if( (_day+day) > day_of_month(_year,_month) )
{
_month = _month+1;
_day = day - (day_of_month(_year,_month) - _day) + 1;
if(_day == 0)
{
_day += 1;
}
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
else
{
_day=_day+day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
return *this;
}
Date operator-(int day)
{
if( (_day-day) <= 0 )
{
_month = _month-1;
if(_month == 0)
{
_month = 12;
}
if(_day == 0)
{
_day = day_of_month(_year,_month);
}
_day=_day-day;
_day = day_of_month(_year,_month) + _day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
else
{
_day=_day-day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
return Date(_year,_month,_day);
}
Date& operator-=(int day)
{
if( (_day-day) <= 0 )
{
_month = _month-1;
if(_month == 0)
{
_month = 12;
}
if(_day == 0)
{
_day = day_of_month(_year,_month);
}
_day=_day-day;
_day = day_of_month(_year,_month) + _day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
else
{
_day=_day-day;
cout<<"month = "<<_month<<"day = "<<_day<<endl;
}
return *this;
}
// 另外日期 + 日期没有意义? //没有意义
// 计算日期 - 日期以后的天数。
int operator-(const Date& d)
{
int i = 0;
int j = 0;
int value;
for(;_year<0;_year--)
{
if(is_leap_year(_year) == true)
{
i +=_year * 366;
}
else
{
i +=_year * 365;
}
}
int tmp = d._year;
for(;tmp<0;tmp--)
{
if(is_leap_year(tmp) == true)
{
j += tmp * 366;
}
else
{
j += tmp * 365;
}
}
int p = _month;
while(p)
{
i += day_of_month(_year,_month);
p--;
}
int q = d._month;
while(q)
{
j += day_of_month(tmp,d._month);
q--;
}
i += _day;
j += d._day;
value = i - j;
if(value < 0)
{
value=-value;
}
cout<<"相差天数"<<value<<endl;
return value;
}
Date operator++()
{
++_day;
if(_day > day_of_month(_year,_month))
{
_day = 1;
_month++;
if(_month > 12)
{
_year++;
_month = 1;
}
}
}
Date& operator++(int) // 后置++
{
_day++;
if(_day > day_of_month(_year,_month))
{
_day = 1;
_month++;
if(_month > 12)
{
_year++;
_month = 1;
}
}
return *this;
}
Date operator--()
{
--_day;
if(_day < 1)
{
_month--;
_day=day_of_month(_year,_month);
if(_month < 1)
{
_year--;
_month = 12;
}
}
}
Date& operator--(int) // 后置--
{
_day--;
if(_day < 1)
{
_month--;
_day=day_of_month(_year,_month);
if(_month < 1)
{
_year--;
_month = 12;
}
}
return *this;
}
bool operator > (const Date& d)
{
if(_year > d._year)
{
cout<<"True\n";
return true;
}
else
{
if(_month > d._month)
{
cout<<"True\n"<<endl;
return true;
}
else
{
if(_day > d._day)
{
cout<<"True"<<endl;
return true;
}
else
{
cout<<"Falese\n"<<endl;
return false;
}
}
}
cout<<"false\n";
return false;
}
bool operator >= (const Date& d)
{
if(_year > d._year)
{
cout<<"True\n";
return true;
}
else if(_year < d._year)
{
cout<<"False"<<endl;
return false;
}
else
{
if(_month > d._month)
{
cout<<"True\n"<<endl;
return true;
}
else if(_month < d._month)
{
cout<<"False\n"<<endl;
return false;
}
else
{
if(_day > d._day)
{
cout<<"True"<<endl;
return true;
}
else if(_day < d._day)
{
cout<<"False\n"<<endl;
return false;
}
else
{
cout<<"Falese\n"<<endl;
return false;
}
}
}
cout<<"false\n";
return false;
}
bool operator < (const Date& d)
{
if(_year < d._year)
{
cout<<"True\n";
return true;
}
else
{
if(_month < d._month)
{
cout<<"True\n"<<endl;
return true;
}
else
{
if(_day < d._day)
{
cout<<"True"<<endl;
return true;
}
else
{
cout<<"Falese\n"<<endl;
return false;
}
}
}
cout<<"false\n";
return false;
}
bool operator <= (const Date& d)
{
if(_year < d._year)
{
cout<<"True\n";
return true;
}
else if(_year > d._year)
{
cout<<"False"<<endl;
return false;
}
else
{
if(_month < d._month)
{
cout<<"True\n"<<endl;
return true;
}
else if(_month > d._month)
{
cout<<"False\n"<<endl;
return false;
}
else
{
if(_day < d._day)
{
cout<<"True"<<endl;
return true;
}
else if(_day > d._day)
{
cout<<"False\n"<<endl;
return false;
}
else
{
cout<<"False\n"<<endl;
return false;
}
}
}
cout<<"False\n";
return false;
}
bool operator == (const Date& d)
{
if(_day == d._day && _month ==d._month && _year == d._year)
{
return true;
}
else
{
return false;
}
}
bool operator != (const Date& d)
{
if(_day == d._day && _month ==d._month && _year == d._year)
{
cout<<"False"<<endl;
return false;
}
else
{
cout<<"True"<<endl;
return true;
}
}
private:
int _year;
int _month;
int _day;
};
void test_date1 ()
{
// 正常日期测试
Date d1(2015, 4, 26);
d1.display ();
// 非法日期测试
Date d2(2015, 2, 30);
d2.display ();
Date d3(d1);
d3.display();
d3 = d2;
d3.display ();
int year = 2000;
if (Date::is_leap_year (year))
{
cout<<year<<" is leap year"<<endl;
}
else
{
cout<<year<<" is not leap year"<<endl;
}
int month = 5;
cout<<"day of "<<month<<" month:"<<Date::day_of_month(year, month)<<endl<<endl;
year = 1999;
if (Date::is_leap_year (year))
{
cout<<year<<" is leap year"<<endl;
}
else
{
cout<<year<<" is not leap year"<<endl;
}
cout<<"day of "<<month<<" month:"<<Date::day_of_month(year, month)<<endl<<endl;
}
#endif // DATE_HPP_INCLUDED
C++ 声明并实现一个日期类(运算符重载)
最新推荐文章于 2024-06-30 10:29:34 发布