题解 | #日期累加#

日期累加

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();
    }
}
#牛客创作赏金赛#
刷题 - 解题 文章被收录于专栏

记录遇到的题目,解题思路和相关知识点

全部评论

相关推荐

04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务