您的位置:首页 > 编程语言 > C语言/C++

【C++】日期类+日期万年历+日期计算器

2016-05-30 15:04 288 查看
对于日期类,我们主要实现一下日期类的基本函数,构造,拷贝构造,运算符的重载,析构。当然这里运算符的重载需要实现的还是挺多的,如:=、<、>、<=、>=、等
#include <iostream>
using namespace std;

class Date
{
public:
Date(int year = 1990, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}

Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}

~Date()
{}

//万年历
bool operator == (const Date& d)
{
return this->_year == d._year
&& this->_month == d._month
&& this->_day == d._day;
}

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

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

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

对于实现日期计算器,我们主要考虑的是加天数和减天数,那么问题就来了,对于加法,如果加的日期超过当前月的天数就需要考虑月的进位,对于年来说,如果月份大于12就需要重置为1,年进位。还需要考虑的一个问题就是,是否为闰年的2月份天数不同,那么应该如何解决呢?我们用一个数组把每个月的天数给保存起来,然后写一个判断闰年的函数,如果是闰年就在数组对应的2月上加上1天。对于减法,就相当于加上一个负天数,问题和加法一样。
// 日期计算器
Date operator+ (int day);
Date operator+= (int day);

Date operator- (int day)
{
this->_day -= day;
while (_day < 0)
{
_day += GetMonthDay(2016, 3);
_month -= 1;
if (_month < 1)
{
_month = 12;
_year -= 1;
}
}
return *this;
}
Date operator-= (int day);

Date operator++();
Date operator++(int);

Date operator--();
Date operator--(int);

int operator-(const Date& d);

//计算器
Date& calendar(int day = 0)
{
if (day > 0)//加正天数
{

this->_day += day;

while (_day > GetMonthDay(2016, 2))
{
_day -= GetMonthDay(2016, 2);
_month += 1;
if (_month > 12)
{
_month = 1;
_year += 1;
}
}
}
else//加负天数
{
this->_day -= day;
while (_day < 0)
{
_day += GetMonthDay(2016, 3);
_month -= 1;
if (_month < 1)
{
_month = 12;
_year -= 1;
}
}
}

return *this;
}

private:
bool IsLeapYear(int year)
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
return true;
}
return false;
}

int GetMonthDay(int year, int month)
{
int monthArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int day = monthArray[month];

if (month == 2 && IsLeapYear(year))
{
day += 1;
}

return day;
}

private:
int _year;
int _month;
int _day;


本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1765067
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐