题解 | #日期累加#
日期累加
https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d
题目
日期累加
描述
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述: 输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述: 输出m行,每行按yyyy-mm-dd的个数输出。
重点知识点
对象引用,默认构造函数,局部变量初始化,日期计算逻辑
对象引用
函数前加Date&,表示返回值是该日期对象自己
函数前加Date,表示返回值是一个日期对象
函数形参中用Date& d,表示参数是一个Date类对象
- 不论怎样,对象调用类中的函数,即有一个隐含的*this,不是前面写Date才引用该日期
Date& operator+=(int day)
{
_day+=day;
while(_day>GetMonthDay(_year,_month))
{
_day-=GetMonthDay(_year,_month);
_month++;
if(_month>12)
{
_month=1;
_year++;
}
}
return *this;
}
Date operator+(int day)
{
Date temp(*this);
temp+=day;
return temp;
}
void Print()
{
printf("%04d-%02d-%02d\n",_year,_month,_day);
}
默认构造函数
未显式定义默认构造函数
Date operator+(int day)
{
Date temp(*this);
temp+=day;
return temp;
}
这里的temp会调用默认构造函数,最开始我的构造函数为
Date();
Date(int year,int month,int day)
:_year(year),_month(month),_day(day){}
Date(const Date& d)
{
_year=d._year;
_month=d._month;
_day=d._day;
}
此处的
Date();
仅仅是默认构造函数原型的声明,未定义
特别是当类中已经有其他构造函数(如 Date(int year, int month, int day))时,编译器不会为你自动生成默认构造函数。所以有报错
/tmp/a-656a8e.o: In function main':
a.cpp:(.text+0x43): undefined reference to Date::Date()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
正确修改
Date(){}
使用 C++ 提供的默认初始化行为(例如,将 int 类型的成员初始化为 0)
Date()
:_year(0),_month(0),_day(0){}
这样可以显示控制初始默认值
局部变量初始化
Date operator+(int day)
{
Date temp(*this);
temp+=day;
return temp;
}
这里的temp要用*this进行拷贝构造来初始化,否则默认year、month、day都为0.易忘
日期计算逻辑
int GetMonthDay(int year,int month)
{
int DayArray[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
if(month == 2 && (year%400 == 0 || (year%100!=0&&year%4==0)))
{
return 29;
}
return DayArray[month];
}
Date& operator+=(int day)
{
_day+=day;
while(_day>GetMonthDay(_year,_month))
{
_day-=GetMonthDay(_year,_month);
_month++;
if(_month>12)
{
_month=1;
_year++;
}
}
return *this;
}
最开始if条件语句中的判断思考错误
if(_month==12)
{
_month=1;
_year++;
}
这样当,month==12,day>GetMonthDay()时,month自增为12,又再if中继续增为1,导致跳过了12月
修改后
if(_month>=12)
{
_month=1;
_year++;
}
相当于放大了判断条件,还是会跳过12月
最终正确
if(_month>12)
{
_month=1;
_year++;
}
代码
#include <iostream>
using namespace std;
class Date
{
public:
Date()
:_year(0),_month(0),_day(0){}
Date(int year,int month,int day)
:_year(year),_month(month),_day(day){}
Date(const Date& d)
{
_year=d._year;
_month=d._month;
_day=d._day;
}
int GetMonthDay(int year,int month)
{
int DayArray[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
if(month == 2 && (year%400 == 0 || (year%100!=0&&year%4==0)))
{
return 29;
}
return DayArray[month];
}
Date& operator+=(int day)
{
_day+=day;
while(_day>GetMonthDay(_year,_month))
{
_day-=GetMonthDay(_year,_month);
_month++;
if(_month>12)
{
_month=1;
_year++;
}
}
return *this;
}
Date operator+(int day)
{
Date temp(*this);
temp+=day;
return temp;
}
void Print()
{
printf("%04d-%02d-%02d\n",_year,_month,_day);
}
private:
int _year;
int _month;
int _day;
};
int main()
{
int n;
int year,month,day,d;
cin >>n;
for(int i=0;i<n;i++)
{
cin >>year>>month>>day>>d;
Date d1(year,month,day);
Date d2(d1+d);
d2.Print();
}
}
#牛客创作赏金赛#记录遇到的题目,解题思路和相关知识点