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
 
2/2 首页 上一页 1 2 |