一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
题目描述
下面是一个日期类的定义,请在类外实现其所有的方法,并在主函数中生成对象测试之。
注意,在判断明天日期时,要加入跨月、跨年、闰年的判断
例如9.月30日的明天是10月1日,12月31日的明天是第二年的1月1日
2月28日的明天要区分是否闰年,闰年则是2月29日,非闰年则是3月1日
输入
测试数据的组数t
第一组测试数据的年 月 日
..........
要求第一个日期的年月日初始化采用构造函数,第二个日期的年月日初始化采用setDate方法,第三个日期又采用构造函数,第四个日期又采用setDate方法,以此类推。
输出
输出今天的日期
输出明天的日期
输入样例1
4
2012 1 3
2012 2 28
2012 3 31
2012 4 30
输出样例1
Today is 2012/01/03
Tomorrow is 2012/01/04
Today is 2012/02/28
Tomorrow is 2012/02/29
Today is 2012/03/31
Tomorrow is 2012/04/01
Today is 2012/04/30
Tomorrow is 2012/05/01
思路分析
用参数列表初始化方法来解决。
定义默认值参数的构造函数:
Date::Date():year(1900),month(1),day(1){}
定义带参数的构造函数。
Date::Date(int y,int m,int d):year(y),month(m),day(d){}
要求第一个日期的年月日初始化采用构造函数,第二个日期的年月日初始化采用setDate方法,第三个日期又采用构造函数,第四个日期又采用setDate方法,那么就分奇数次偶数次选择。
然后我们来看实现计算日期的下一天的功能。
我们首先分成两大类,一是闰年,二是不是闰年。
然后大类里面分成五种情况,首先是下一天到了下一个月的情况,二月特殊先判断,然后判断天数为31天的月份,然后是天数为30天的月份,然后是下一天到了下一年的情况,之后是一般情况就直接day加一完事。
AC代码
#include"iostream"
#include"iomanip"
#include"cmath"
using namespace std;
class Date
{
private:
int year,month,day;
public:
Date();
Date(int y,int m,int d);
int getYear();
int getMonth();
int getDay();
void setDate(int y,int m,int d);
void print();
void addOneDay();
};
Date::Date():year(1900),month(1),day(1){}
Date::Date(int y,int m,int d):year(y),month(m),day(d){}
int Date::getYear()
{
return year;
}
int Date::getMonth()
{
return month;
}
int Date::getDay()
{
return day;
}
void Date::setDate(int y,int m, int d)
{
year=y;
month=m;
day=d;
}
void Date::addOneDay()
{
if(year%100!=0&&year%4==0||year%400==0)
{
if(month==2&&day==28)
{
day++;
return;
}
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
if(day==31)
{
month++;
day=1;
return;
}
}
if(month==4||month==6||month==8||month==9||month==11)
{
if(day==30)
{
month++;
day=1;
return;
}
}
if(month==12&&day==31)
{
year++;
month=1;
day=1;
return;
}
day++;
}
else
{
if(month==2&&day==28)
{
month++;
day=1;
return;
}
if(month==1||month==3||month==5||month==7||month==8||month==10)
{
if(day==31)
{
month++;
day=1;
return;
}
}
if(month==4||month==6||month==8||month==9||month==11)
{
if(day==30)
{
month++;
day=1;
return;
}
}
if(month==12&&day==31)
{
year++;
month=1;
day=1;
return;
}
day++;
}
}
void Date::print()
{
cout<<year<<'/'<<setfill('0')<<setw(2)<<month<<'/'<<setw(2)<<day<<endl;
}
int main()
{
int i,t,year,month,day;
cin>>t;
for(i=1;i<=t;i++)
{
cin>>year>>month>>day;
if(i%2==1)
{
Date date(year,month,day);
cout<<"Today is ";
date.print();
date.addOneDay();
cout<<"Tomorrow is ";
date.print();
}
else
{
Date date;
date.setDate(year,month,day);
cout<<"Today is ";
date.print();
date.addOneDay();
cout<<"Tomorrow is ";
date.print();
}
}
}