OJ题之Date(类与构造)

158 阅读12分钟

​一起养成写作习惯!这是我参与「掘金日新计划 · 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();		
		}
	}
}