设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算。
要求在Date类中设计如下重载运算符函数:
Date operator+(int days):返回某日期加上天数得到的日期
Date operator-(int days):返回某日期减去天数得到的日期
int operator-(Date&b):返回两日期相差的天数
leap(int):判断指定的年份是否为闰年
dton(Date &):将指定日期转换成从年月日起的天数
ntod(int):将指定的年月日起的天数转换成对应的日期
#include <iostream>
using namespace std;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
class Date
{ int year,mon,day;
bool leap(int);
int dton(Date &);
Date ntod(int);
public:
Date(int a=2002,int b=11, int c=20 )
{year=a;
mon=b;
day=c;}
Date operator+(int);
Date operator-(int);
int operator-(Date &b);
int gety()
{return year;}
int getm()
{return mon;}
int getd()
{return day;}
};
bool Date::leap(int t)
{if (t%4) return false;
else return true;
}
int Date::dton(Date &d) //将此对象的日期转化为从d年月日起的天数;
{int yd,md,dd,DAY=0;
if (d.year>year) { return -1;}
else if ((d.year==year)&&(d.mon>mon)){ return -1;}
else if ((d.year==year)&&(d.mon==mon)&&(d.day>=day)){return -1;}
yd=year-d.year;
md=mon-d.mon;
dd=day-d.day;
if ((yd==0)&&(md==0)) {return dd;}
else if (yd==0)
{DAY+=a[d.mon-1]-d.day;
DAY+=day;
for(int i=d.mon;i<mon-1;i++)
{DAY+=a[i];}
}
else
{
for (int i=d.mon;i<=12;i++)
{ if (i==d.mon) {DAY+=a[i-1]-d.day;}
else DAY+=a[i-1];
}
for (int i=d.year+1;i<year;i++)
{ if (leap(i)) {DAY+=366;}
else {DAY+=365;}
}
for (int i=mon;i>0;i--)
{ if (i==mon) {DAY+=day;}
else DAY+=a[i-1];
}
}
return(DAY);
}
Date Date::ntod(int n) //将指定的年月日起的n天数转化为对应日期
{int ty,tm,td,p;
ty=year;
tm=mon;
p=tm;
if (n-(a[mon-1]-day)<=0)
{Date m(ty,tm,day+n);
return m;}
n=n-(a[mon-1]-day);
td=a[tm-1];
if (leap(ty)) a[1]=29;
else a[1]=28;
while(n>a[p])
{tm++;p++;
td=a[p-1];
n-=a[p-1];
if (leap(ty+tm/12)) a[1]=29;
else a[1]=28;
if (tm%12==0) p=0;
}
ty+=tm/12;
tm=tm%12;
if (tm==0)
{Date m(ty,1,n);
return m;
}
else
{ Date m(ty,tm+1,n);
return m;}
}
Date Date::operator+(int n)
{*this=ntod(n);
return *this;
}
Date Date::operator-(int m)
{int p=0;
Date test(year,mon,day);
if (leap(year)) a[1]=29;
else a[1]=28;
while(p!=m)
{if (test.day==1)
{if (test.mon!=1)
{test.mon--;
test.day=a[test.mon-1];
}
else
{ test.year--;
test.mon=12;
test.day=31;
}
}
else
{ test.day--;
}
p=dton(test);
}
return test;
}
int Date::operator-(Date &b)
{return dton(b);
}
void main()
{int r,y1,y2,m1,m2,d1,d2;
int y,m,d,day12;
cout<<"请输入指定日期的年月日:"<<endl;
cin>>y>>m>>d;
Date t1(y,m,d),t0(y,m,d),t2;
cout<<"请输入天数:"<<endl;
cin>>r;
t1+r;
t2=t0-r;
cout<<"指定日期后"<<r<<"天的日期为"<<t1.gety()<<"年"<<t1.getm()<<"月"<<t1.getd()<<"日"<<endl;
cout<<"指定日期前"<<r<<"天的日期为"<<t2.gety()<<"年"<<t2.getm()<<"月"<<t2.getd()<<"日"<<endl;
cout<<"请分别输入两个日期的年月日:"<<endl;
cin>>y1>>m1>>d1>>y2>>m2>>d2;
Date n1(y1,m1,d1),n2(y2,m2,d2);
day12=n1-n2;
if (day12<0) day12=n2-n1;
cout<<"两个日期之间相差"<<day12<<"天"<<endl;
}
大部分数据是对的但是有一些数据测试会和预期结果相差1天
尝试了闰年有关的数据但是没有问题
出问题的数据:
请分别输入两个日期的年月日:
2004 3 30
2020 4 20
两个日期之间相差5864天
(少了一天)
请分别输入两个日期的年月日:
2002 3 19
2004 5 20
两个日期之间相差792天
(少了1天)
感觉应该还是闰年的问题??