【练习题】日期累加

类的定义

class Date {
    
    
public:
Date(int y = 1, int m = 1, int d = 1)
	{
    
    
		//判断日期是否有效
		if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m))
		{
    
    
			//日期无效
			y = 1;
			m = 1;
			d = 1;
			cout << "日期无效,设为默认值:1-1-1" << endl;
		}
		else
		{
    
    
			_y = y;
			_m = m;
			_d = d;
		}

	}
	private:
	int _y;
	int _m;
	int _d;
};

首先来看类的定义:
类中有三个数据成员,_y,_m,_d分别代表年份,月份,天数。
定义了一个带默认参数的构造函数,在构造函数中还加入了日期格式的判断,如果日期不合法,则使用参省值初始化对象(1-1-1)。

getday()

int getday(int y, int m)
	{
    
    
		static int days[] = {
    
     0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[m];
		//如果为二月,并且为闰年,修改天数
		if (m == 2 && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))
			day += 1;
		return day;
	}

这个函数的作用是获取当前月份的天数,创建一个静态数组来存储天数,数组第一个元素设置为0,这这样的话数组下标就可以看作是月份,方便操作。
2月分为闰月29天,及平月28天,注意加上判断。

重载运算符+=

//日期的运算
	//Date += int
	//左操作数改变为相加后的结果
	//2021。2.4 + 90 : 2021.2.94 -28 ---> 2021.3.66 - 31 ---> 2021.4.35 - 30 ---> 2021.5.5
	Date& operator+=(int day)
	{
    
    
		//首先天数相加
		_d += day;
		//判断是否溢出
		while (_d > getday(_y, _m))
		{
    
    
			//减去当月天数
			_d -= getday(_y, _m);
			//月份进位
			++_m;
			//月份是否溢出
			if (_m == 13)
			{
    
    
				//年份进位
				++_y;
				//月份更新为一月
				_m = 1;
			}
		}
		//返回相加之后的结果
		return *this;
	}

重载+=运算符,是为了实现类的对象与天数进行相加的操作,
例如:
Date a(2021,1,1)+=1; //该操作后a对象的值应该变为a(2021,1,2)
此处要注意月份溢出后,年份进1位,还要将月份重新赋值为1月

友元函数重载<<

ostream& operator<<(ostream& _cout, const Date& d)
{
    
    
	//_cout << d._y << "-" << d._m << "-" << d._d;
	printf("%04d-",d._y);
	printf("%02d-", d._m);
	printf("%02d", d._d);
	return _cout;
}

此处使用友元函数重载<<运算符
是类的对象可以直接用标准输出流对象来输出,更加直观。

完整代码

计算机考研复试题:日期累加

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date {
    
    
public:

	friend ostream& operator<<(ostream& _cout, const Date& d);
	Date(int y = 1, int m = 1, int d = 1)
	{
    
    
		//判断日期是否有效
		if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m))
		{
    
    
			//日期无效
			y = 1;
			m = 1;
			d = 1;
			cout << "日期无效,设为默认值:1-1-1" << endl;
		}
		else
		{
    
    
			_y = y;
			_m = m;
			_d = d;
		}

	}
	int getday(int y, int m)
	{
    
    
		static int days[] = {
    
     0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[m];
		//如果为二月,并且为闰年,修改天数
		if (m == 2 && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))
			day += 1;
		return day;
	}
	//日期的运算
	//Date += int
	//左操作数改变为相加后的结果
	//2021。2.4 + 90 : 2021.2.94 -28 ---> 2021.3.66 - 31 ---> 2021.4.35 - 30 ---> 2021.5.5
	Date& operator+=(int day)
	{
    
    
		//首先天数相加
		_d += day;
		//判断是否溢出
		while (_d > getday(_y, _m))
		{
    
    
			//减去当月天数
			_d -= getday(_y, _m);
			//月份进位
			++_m;
			//月份是否溢出
			if (_m == 13)
			{
    
    
				//年份进位
				++_y;
				//月份更新为一月
				_m = 1;
			}
		}
		//返回相加之后的结果
		return *this;
	}
private:
	int _y;
	int _m;
	int _d;
};

ostream& operator<<(ostream& _cout, const Date& d)
{
    
    
	//_cout << d._y << "-" << d._m << "-" << d._d;
	printf("%04d-",d._y);
	printf("%02d-", d._m);
	printf("%02d", d._d);
	return _cout;
}
int main()
{
    
    
	int i = 0;
	cin >> i;
	int y, m, d,num;
	while (i-- > 0)
	{
    
    
		cin >> y >> m >> d >> num;
		Date a(y, m, d);
		a += num;
		cout << a << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43962381/article/details/114989130
今日推荐