题意:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入:20110412 20110422 输出:11
思路一:将两个日期分别与其对应年的第一天相减,用得到的数据大的减去小的,最后就是相差的数值。
思路二:构造一个日期类,核心思想在重载d1-d2,并且复用operator++,小的日期数据自增来等于大的数据,自增次数就是差值。
这里先给出思路二的解法:代码如下。
// 测试程序的设计
int main()
{
int date1,date2;// 两个字符串变量20110411 20110422
int year1,month1,day1,year2,month2,day2;
while(cin >> date1 >> date2)
{
//date1=20230125 date2=20230126
year1 = date1 / 10000,month1 = date1 % 10000 / 100,day1 = date1 % 100000;
year2 = date2 / 10000,month2 = date2 % 10000 / 100,day2 = date2 % 100000;
Data d1(year1,month1,day1);
Data d2(year2,month2,day2);
cout << d1 - d2 << " ";
}
}
// d1 - d2 的重载
int operator-(const Data& d2)
{
// 假设d1大于d2
Data max = d1;
Data min = d2;
int flag = 1;
if(*this < d2)
{
max = d2;
min = d1;
flag = -1;
}
// 小的日期自增来与大的相等,给出自增次数就是两个日期的差值
int count = 0;// 自增次数
while(min != max)
{
++count;
++min;
}
return count*flag;
}
// 实现了operator-的重载,我们还需要实现小于,不等于,自增,加等的重载
Data& operator+=(int day)// d1+=某个数
{
_day = _day + day;
while(_day > getmonthday(_year,_month))
{
++_month;
_day = _day - getmonthday(_year,_month);
if(_month == 13)
{
++_year;
_month = 1;
}
}
return *this;
}
bool operator>(const Data& d2)
{
if(_year > d2._year)
return true;
else if(_year == d2._year && _month > d2._month)
return true;
else if(_year == d2._year && _month == d2._month && _day > d2._day)
return true;
else
return false;
}
bool operator<(const Data& d2)
{
if(_year < d2._year)
return true;
else if(_year == d2._year && _month < d2._month)
return true;
else if(_year == d2._year && _month == d2._month && _day < d2._day)
return true;
else
return false;
}
bool operator!=(const Data& d2)
{
return (_year != d2._year
&& _month != d2._month
&& _day != d2._day);
}
bool operator==(const Data& d2)
{
return (_year == d2._year
&& _month == d2._month
&& _day == d2._day);
}
Data& operator++()// 前置++
{
*this += 1;
return *this;
}
// 获取12个月中某一个月有几天
int getmonthday(int year,int month)
{
int month_day[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if((month == 2) && (year % 4 == 0 %% year % 100 !=0) || (year % 400 == 0))
{
return 29;
}
else
return month_day[month];
}
// data的构造函数
Data(int year = 1,int month = 1,int day = 1)
{
if(year >= 1 && month >= 1 && month <=12 && day >= 1 && day <= getmonthday(year,month))
{
_year = year;
_month = month;
_day = day;
}
else
count << "输入不合法" << "endl";
}