C++习题与解析(重载-02)
05.设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。
解:
在Date类中设计如下重载运算符函数:
Date operator+(int days); 返回一日期加一天数得到的日期
Date operator-(int days); 返回一日期减去天数得到的日期
int operator-(Date &b); 返回两日期相差的天数
在实现这些重载运算符函数调用以下私有成员函数:
leap(int); 判定指定的年份是否为闰年
dton(Date &); 将指定日期转换为从0年0月0日起的天数
ntod(int); 将指定的0年0月0日起的天数转换为对应的日期
本题程序如下:
#include
int day_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
{
int year,month,day;
int leap(int);
int dton(Date &);
Date ntod(int);
public:
Date(){}
Date(int y,int m,int d)
{
year=y;month=m;day=d;
}
void setday(int d){day=d;}
void setmonth(int m){month=m;}
void setyear(int y){year=y;}
int getday(){return day;}
int getmonth(){return month;}
int getyear(){return year;}
Date operator+(int days)
{
static Date date;
int number=dton(*this)+days;
date=ntod(number);
return date;
}
Date operator-(int days)
{
static Date date;
int number=dton(*this);
number-=days;
date=ntod(number);
return date;
}
int operator-(Date &b)
{
int days=dton(*this)-dton(b)-1;
return days;
}
void disp()
{
cout< } }; int Date::leap(int year) { if(year%4==0&&year%100!=0year%400==0) // 是闰年 return 1; else // 不是闰年 return 0; } int Date::dton(Date &d) { int y,m,days=0; for(y=1;y<=d.year;y++) if(leap(y)) days+=366; else days+=365; for(m=0;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) { int y=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() { Date now(2002,6,12),then(2003,2,10); cout<<"now:"; now.disp(); cout<<"then:"; then.disp(); cout<<"相差天数:"<<(then-now)< Date d1=now+100,d2=now-100; cout<<"now+100:"; d1.disp(); cout<<"now-100:"; d2.disp(); } 本程序的执行结果如下: now:2002.6.12 then:2003.2.10 相差天数:242 now+100:2002.9.20 now-100:2002.3.4
- 上一篇:C++习题与解析(引用-02)
- 下一篇:C++习题与解析(重载-03)