运算符重载综合练习题目:
设计一个日期类Date,包括年、月、日等私有成员。
要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。
基本设计思路及要求:
1.在Date类中设计如下重载运算符函数:
Date operator+(int days); 返回一个日期加上一个天数得到的日期
Date operator-(int days); 返回一个日期减去一个天数得到的日期
int operator-(Date &b); 返回两日期相差的天数
2.在实现这些重载运算符函数调用以下私有成员函数:
leap(int); 判断指定的年份是否为闰年
transDate(Date &); 将指定日期转换为从0年0月0日起的天数
transDay(int); 将指定的0年0月0日起的天数转换为对应的日期
3.在main( )中,实现日期的基本运算:
(1).闰年与非闰年的判断,以及各月的天数的获得问题,解决办法可设置并引用二维数组;
(2).日期基本问题的实现问题,解决办法是在Date类中设计重载运算符函数:Date operator+(int days)、Date operator-(int days)、int operator-(Date &b),同时调用以下私有成员函数leap(int)、transDate (Date &)、transDay (int)得以实现;
#include <iostream>
using namespace std;
/*
*题目:设计一个日期类Date,包括年、月、日等私有成员。
要求实现基本运算:如一个日期加上天数,一个日期减去天数、两个日期相差天数。
*作者:youshen_wwd
*日期:2020/5/28
*/
//一个二维数组保存闰年与平年的每月的日子数
int each_month[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
class Date{
private:
int year;//年
int month;//月
int day;//日
bool leap (int y){//判断指定年份是否为闰年
if (((y%4==0)&&(y%100!=0))||(y%400==0))
return true;
else
return false;
}
int transDate(Date &d){//将指定日期转换为从0年0月0日起的天数
int days=0;
for(int y=1;y<=d.year;y++){
if (leap(y)==true)//若为闰年则添加366天,反之添加365天
days+=366;
else
days+=365;
}
for(int m=1;m<d.month;m++){//计算月份天数
if (leap(d.year)==true)
days+=each_month[1][m-1];
else
days+=each_month[0][m-1];
}
days+=d.day;
return days;
}
Date transDay(int days){//将指定的0年0月0日起的天数转换为对应的日期
int y=1;
int m=1;
int rest=days;
while(1){
if(leap(y)){//若是闰年则递减366天
if(rest<=366)
break;
else
rest-=366;
}
else{//若是平年则递减365天
if(rest<=365)
break;
else
rest-=365;
}
y++;
}
y--;//执行到此年份y已确定
bool lp=leap(y);
while(true){
if(lp){//计算月份
if(rest>each_month[1][m-1])
rest-=each_month[1][m-1];
else
break;
}
else{
if(rest>each_month[0][m-1])
rest-=each_month[0][m-1];
else
break;
}
m++;
}
int d=rest;//日
return Date(y,m,d);
}
public:
Date(){year=0;month=0;day=0;}
Date(int y,int m,int d){year=y;month=m;day=d;}
Date operator+(int days){//返回一个日期加上一个天数得到的日期
Date date;
int sdays=transDate(*this)+days;
date=transDay(sdays);
return date;
}
Date operator-(int days){//返回一日期减去天数得到的日期
Date date;
int sdays=transDate(*this)-days;
date=transDay(sdays);
return date;
}
int operator-(Date &d){//返回两日期相差的天数
int cdays=transDate(*this)-transDate(d);
if(cdays>=0)
return cdays;
else
return -cdays;
}
void display(){
cout<<year<<"/"<<month<<"/"<<day<<endl;
}
};
int main()
{
Date d1(1999,10,22);
Date d2(2000,10,30);
cout<<"第一个日期是"<<endl;
d1.display();
cout<<"第二个日期是"<<endl;
d2.display();
Date newd1=d1+20;
cout<<"第一个日期加上20天后的日期是";
newd1.display();
Date newd2=d2-29;
cout<<"第二个日期减去29天后的日期是";
newd2.display();
int days=d2-d1;
cout<<"两个日期相差天数为"<<days;
}
特别注意*this的用法,也可在二元运算符重载那儿使用友元函数。