题解 | #打印日期#

打印日期

https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b

题目

打印日期

描述

描述:给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

重点知识点

引用、打印格式、逻辑思考

引用

形参引用变量

Date(const Date& d)
    {
        _year=d._year;
        _month=d._month;
        _day=d._day;
    }

返回类型引用变量

Date& GetMonth(int year,int day)
    {
        _month=1;
        _day=day;
        int Feb=28;
        if(year%400==0||(year%100!=0&&year%4==0))
        {
            Feb=29;
        }
        int DayArray[13]={-1,31,Feb,31,30,31,30,31,31,30,31,30,31};
        for(int i=1;_day>DayArray[i];i++)
        {
            _day-=DayArray[i];
            _month++;
        }
        return *this;
    }

    Date& Print()
    {
        //cout<<_year<<'-'<<_month<<'-'<<_day<<endl;  //输出时,不满10不会自动补0
        printf("%04d-%02d-%02d\n",_year,_month,_day);
        return *this;
    }

打印格式

最开始用

cout<<_year<<'-'<<_month<<'-'<<_day<<endl;

但不满足预期输出

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

不能在不满10时自动补0,后来改用printf,得到预期输入

printf("%04d-%02d-%02d\n",_year,_month,_day);

逻辑思考

构造函数

刚开始想创建两个参数不同的构造函数,第一个获取年和日初始化,第二个获取年、月、日初始化

但第二个构造函数的功能仅是使日期对象_month变量赋值,这一点在获取月份的函数GetMonth函数中也可以做到

日变化逻辑

刚开始用_day>0判断循环,然后实现_day-=DayArray[i],if(_day>DayArray[i])

但这样会导致_day一直减到<=0

修改后用_day>DayArray[i]判断循环,然后实现_day-=DayArray[i],if(_day>0)

代码

#include <iostream>
using namespace std;

class Date
{
public:
    Date();
    Date(int year,int day)
    :_year(year),_day(day){}
    // 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& GetMonth(int year,int day)
    {
        _month=1;
        _day=day;
        int Feb=28;
        if(year%400==0||(year%100!=0&&year%4==0))
        {
            Feb=29;
        }
        int DayArray[13]={-1,31,Feb,31,30,31,30,31,31,30,31,30,31};
        for(int i=1;_day>DayArray[i];i++)
        {
            _day-=DayArray[i];
            _month++;
        }
        return *this;
    }

    Date& Print()
    {
        //cout<<_year<<'-'<<_month<<'-'<<_day<<endl;  //输出时,不满10不会自动补0
        printf("%04d-%02d-%02d\n",_year,_month,_day);
        return *this;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main() 
{
    int year,day;
    while(cin>>year>>day)
    {
        Date d(year,day);
        d.GetMonth(year,day);
        d.Print();
    }
}
// 64 位输出请用 printf("%lld")
#牛客创作赏金赛#
刷题 - 解题 文章被收录于专栏

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-23 18:34
点赞 评论 收藏
分享
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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