打印本文 打印本文  关闭窗口 关闭窗口  
C++习题与解析(重载-02)
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:40:51  文章录入:杜斌  责任编辑:杜斌

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<iostream.h> 
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<<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) 

int y,m,days=0; 
for(y=1;y<=d.year;y++) 
if(leap(y)) 
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) 

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)<<endl; 
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 


 
打印本文 打印本文  关闭窗口 关闭窗口