龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++习题与解析(重载-02)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
05.设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。 解: 在Date类中设计如下重载运算符函

  

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

  

  

精彩图集

赞助商链接