【Preguntas del ejercicio】 Acumulación de fechas

Definición de clase

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;
};

Primero observe la definición de la clase:
hay tres miembros de datos en la clase, _y, _m y _d representan el año, mes y día respectivamente.
Se define un constructor con parámetros predeterminados, y el juicio de formato de fecha también se agrega al constructor Si la fecha no es válida, el objeto se inicializará con el valor de referencia (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;
	}

La función de esta función es obtener el número de días del mes actual y crear una matriz estática para almacenar la cantidad de días. El primer elemento de la matriz se establece en 0. De esta manera, el índice de la matriz puede ser considerado como un mes, que es conveniente para la operación.
Febrero se divide en 29 días en un mes bisiesto y 28 días en un mes plano. Preste atención para agregar juicio.

Operador sobrecargado + =

//日期的运算
	//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;
	}

Sobrecargar el operador + = es implementar la operación de sumar el objeto de la clase al número de días,
por ejemplo:
Date a(2021,1,1)+=1; //该操作后a对象的值应该变为a(2021,1,2)
aquí se debe notar que después de que el mes se desborda, el año se lleva por 1 y el mes se re -asignado a enero

Sobrecarga de función de amigo <<

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;
}

Aquí,
se utiliza el operador de sobrecarga de función de amigo << . Los objetos de la clase se pueden generar directamente con objetos de flujo de salida estándar, lo que es más intuitivo.

Código completo

Preguntas de reevaluación de posgrado en informática: acumulación de fechas

#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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43962381/article/details/114989130
Recomendado
Clasificación