设计一个日期类date,包括年月日等私有数据成员,要求通过重载运算符实现日期的基本运算,如某一日期加上天数,某一日期减去天数和两日期相差的天数等。
#include<iostream.h>
const intday_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,31,30,31,30,31}};
//day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年
class date
{
private:
intyear,month,day;
public:
date(){};
date(inty,int m,int d){year=y;month=m;day=d;}
voidsetday(int d){day=d;}
voidsetmomth(int m){month=m;}
voidsetyear(int y){year=y;}
intgetday(){return day;}
intgetmonth(){return month;}
intgetyear(){return year;}
intleap(int); //判定制定的年份是否为闰年
intdton(date &); //将制定的日期转换为从0年0月0日起的天数
datentod(int); //将制0年0月0日起的天数转换为对应的日期
dateoperator+(int days) //返回一日期加一天数得到的日期
{
datedate;
intnumber=dton(*this)+days;
date=ntod(number);
returndate;
}
dateoperator-(int days)//返回一日期减去天数得到的日期
{
date date;
intnumber=dton(*this);
number-=days;
date=ntod(number);
returndate;
}
intoperator-(date &b)//返回两日期相差的天数
{
int days=dton(*this)-dton(b)-1;
return days;
}
voiddisp()
{
cout<<year<<"/"<<month<<"/"<<day<<endl;
}
};
int date::leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;//是闰年
else
return 0;//不是闰年
}
int date::dton(date &d)//将制定的日期转换为从0年0月0日起的天数
{
inty,m,days=0;
for(y=1;y<=d.year;y++)
if(leap(d.year))
days+=366;
else
days+=365;
for(m=0;m<=d.month-1;m++)
if(leap(d.year))
days+=day_tab[1][m];
else
days+=day_tab[0][m];
days=d.day;
return days;
}
date date::ntod(int n)//将制0年0月0日起的天数转换为对应的日期
{
inty=1,m=1,d,rest=n,lp;
while(1)
{
if(leap(y))
{
if(rest<=366)
break;
else
rest-=366;
}
else
{
if(rest<=365)
break;
else
rest-=365;
}
y++;
}
y--;
lp=leap(y);
while(1)
{
if(lp)
{
if(rest>day_tab[1][m-1])
rest-=day_tab[1][m-1];
else
break;
}
else
{
if(rest>day_tab[0][m-1])
rest-=day_tab[0][m-1];
else
break;
}
m++;
}
d=rest;
return date(y,m,d);
}
void main()
{
datenow(2010,10,1),then(2009,10,1);
cout<<"now:";now.disp();
cout<<"then:";then.disp();
cout<<"相差天数:"<<(then-now)<<endl;
date d1=now+100,d2=now-100;
cout<<"now+100:";d1.disp();
cout<<"now-100:";d2.disp();
}