定义日期类(Date),实现对下面运算符的重载:

定义日期类(Date),实现对下面运算符的重载:①-,实现两个日期想减,返回相差天数;②+,实现一个日期加上一个整数,返回新的日期③+,实现一个整数加上一个日期,返回新的... 定义日期类(Date),实现对下面运算符的重载:
① -,实现两个日期想减,返回相差天数;
② +,实现一个日期加上一个整数,返回新的日期
③ +,实现一个整数加上一个日期,返回新的日期(②的交换律)
Date 中就包括年月日就好 不考虑 闰年什么的。 年份数乘以365,月份数乘以30再加上日期数
展开
 我来答
百度网友8aedf19
推荐于2018-04-12 · TA获得超过606个赞
知道小有建树答主
回答量:231
采纳率:100%
帮助的人:112万
展开全部
// 我写了一个,测试过了,没问题。
// 加上一个整数的部分比较难
#include <iostream.h>

int idebug=0;
#define DEVAL(a) cout<<#a<<":"<<a<<endl
#define DEBUG cout<<"-------------------------("<<++idebug<<")-------------------------"<<endl;

// 调试开关
#define DEBUG_SWITCH 0

class Date
{
public:
int operator-(Date& dRight); // 减法
Date operator+(int iRight); // 右加一个整数
friend Date operator+(int iLeft,Date& dRight); // 左加一个整数
Date(int y, int m, int d);
Date(Date& dRsc);
Date();
bool isLeapYear(); // 判断是否闰年
int howNumber(); // 计算该天是该年的第几天
void show(); // 显示
friend ostream& operator<<(ostream& os,Date& dRight); // 流输出
private:
int _year;
int _month;
int _day;
};

bool isleapyear(int iyear)
{ // 判定阳历闰年遵循的一般规律为:四年一闰,百年不闰; 四百年再闰.
return (iyear%4==0 && iyear%100!=0 || iyear % 400 == 0 );
}

bool Date::isLeapYear()
{
return isleapyear(_year);
}

int Date::howNumber()
{
// 先按平年计算
int days[12] = {
31,28,31,30,31,30,
31,31,30,31,30,31,
},dayCount(0);
for ( int i=0; i< _month - 1; ++i )
{
dayCount += days[i];
}
if (isLeapYear() && _month > 2 )
{ // 若是闰年,且过了2月,再加一天
++dayCount;
}
return dayCount + _day;
}

int Date::operator-( Date& dRight )
{
int ires(0);
for (int i=dRight._year; i<_year; ++i)
{
ires += ( 365 + isleapyear(i) );
}
return ires + howNumber() - dRight.howNumber();
}

Date Date::operator+( int iRight )
{
Date dRes(*this);
int monDays[12] = {
31,28,31,30,31,30,
31,31,30,31,30,31,
};

// 按年处理
while ( iRight>365 ) {
if ( _month<2 )
{
iRight -= ( 365 + isleapyear(dRes._year) );
}
else
{
iRight -= ( 365 + isleapyear(dRes._year+1) );
}
dRes._year++;
}

#if DEBUG_SWITCH
dRes.show();
DEVAL(iRight)<<endl;
DEBUG;
#endif

// 不足一年的
while ( iRight>0 )
{
dRes._day++;
--iRight;
if ( dRes._day > monDays[dRes._month-1] )
{
#if DEBUG_SWITCH
DEVAL(monDays[dRes._month-1]);
DEVAL(iRight);
#endif
dRes._day -= monDays[dRes._month-1];
++dRes._month;
if ( dRes._month > 12 )
{
dRes._month -= 12; // 12 + 1 -> 1
dRes._year++;
if ( isleapyear(dRes._year) )
{ // 闰年二月29天
monDays[1] = 29;
}
else
{ // 平年二月28天
monDays[1]=28;
}
}
#if DEBUG_SWITCH
dRes.show();
cout<<endl;
#endif
}
}

return dRes;
}

Date::Date( int y, int m, int d ) :
_year(y), _month(m), _day(d)
{
}

Date::Date( Date& dRsc ) :
_year(dRsc._year),_month(dRsc._month),_day(dRsc._day)
{
}

Date::Date()
{
Date(0,0,0);
}

void Date::show()
{
cout<<_year<<"/"<<_month<<"/"<<_day<<endl;
#if DEBUG_SWITCH
DEVAL(isLeapYear());
DEVAL(howNumber());
#endif
cout<<endl;
}

Date operator+(int iLeft,Date& dRight)
{
return dRight.operator+(iLeft);
}

ostream& operator<<(ostream& os,Date& dRight)
{
os<<dRight._year<<"/"<<dRight._month<<"/"<<dRight._day<<"\n";
return os;
}

int main()
{
Date d1(2011,12,31),d2(2011,1,1);
Date dx;
// d1.show();
// d2.show();
DEVAL(d1);
DEVAL(d2);

int deta=d1-d2;
cout<<"The result of ( d1 - d2 ) is:"<<endl;
cout<<deta<<endl<<endl;

int iStart(0),iCount(0);
cout<<"请输入开始测试的加数iStart:"<<endl;
cin>>iStart;
DEVAL(iStart);
cout<<"请输入测试数目iCount:"<<endl;
cin>>iCount;
DEVAL(iCount);

cout<<"测试结果如下:"<<endl;
for (int i=iStart; i < iStart+iCount; ++i)
{
dx=d1+i;
DEVAL(i);
cout<<"The result of ( d1 + i ):"<<endl;
dx.show();
}

return 0;
}
不宜然EG
2011-12-10 · TA获得超过102个赞
知道答主
回答量:236
采纳率:0%
帮助的人:130万
展开全部
你这个问题看着要求不多,但是要写代码会很多。
因为日期如果是真正的日期,还要比较是不是闰年什么的,对年、月、日进行操作
所以分少别人不会帮你的。
如果日期只是一个数字,那就简单多了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
code2
2011-12-13 · TA获得超过1268个赞
知道小有建树答主
回答量:1316
采纳率:79%
帮助的人:374万
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式