C++有关日期些许题(1)

C++有关日期些许题(1)

题目描述:
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述 :
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述 :
输出m行,每行按yyyy - mm - dd的个数输出。
示例1
输入

1
2008 2 3 100

输出

2008-05-13

做题思路:
本题做法较多,但为了熟悉类的使用,所以该题是以类为基础进行编写程序。如果需要查看具体日期类的实现,可见笔者另一博客,链接为 日期类的实现
方法如下:
(1)根据第一行输入的数据行数创建空数组;
(2)将后续输入数据存入该数组(其中每行数据前三个依次为年月日,第四个数据为需要家的天数);
(3)利用日期Date类对输入的年月日数据进行初始化,并利用重载后的 ‘+=’ 将输入的天数加入到对应的Date对象中,并将最终效果进行打印。

示例程序:

#include<iostream>
using namespace std;
class Date
{
public:
	
	Date(int year = 1, int month = 1, int day = 1)
	{
		//判断日期是否有效
		if (year <= 0 || month <= 0 || month > 12 || day <= 0 || day > getDay(year, month))
		{
			//日期无效,设为默认值
			_year = 1; _month = 1; _day = 1;
			cout << "日期无效,设为默认值 1-1-1 " << endl;
		}
		_year = year; _month = month; _day = day;
	}
	int getDay(int year, int month);
	Date& operator+=(int day)//+= 运算符重载
	{
		_day += day;
		//判断当前对象的_day是否超过正常天数
		while (_day > getDay(_year, _month))
		{
			_day -= getDay(_year, _month);
			++_month;
			if (_month == 13)
			{
				++_year;
				_month = 1;
			}
		}
		//判断当前对象的_day是否反向溢出,即为负值,若是则将时间修改至正确时间
		while (_day <= 0)
		{
			_day += getDay(_year, --_month);
			if (_month == 0)
			{
				--_year;
				_month = 13;
			}
		}
		return *this;
	}
	void display()
	{
		cout << _year << '-';
		if (_month < 10)
			cout << 0 << _month;
		else
			cout << _month;
		if (_day < 10)
			cout << '-' << 0 << _day <<endl;
		else
			cout << '-' << _day <<endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int Date::getDay(int year, int month)
{
	//获取每月的天数
	static int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int day = days[month];
	//判断是否为闰年,若是,2月天数则加1,即29天
	if (month == 2 && ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
	{
		day += 1;
	}
	return day;
}

void test()
{
	//m个数据
	int m = 0;
	cin >> m;
	int *d1 = NULL,*d = NULL;
	d1 = (int *)malloc(m * 4 * sizeof(int));
    d = d1;
	for (int i = 1; i <= m; i++)
	{
		cin >> *(d + i * 4 - 4) >> *(d + i * 4 - 3) >> *(d + i * 4 - 2) >> *(d + i * 4 - 1);
	}
	for (int i = 1; i <= m; i++)
	{
		Date date(*(d + i * 4 - 4), *(d + i * 4 - 3), *(d + i * 4 - 2));
		date.operator+=(*(d + i * 4 - 1));
		date.display();
	}
	free(d);
}

int main()
{
	test();
	
	system("pause");
	return 0;
}

运行结果:

当输入日期为2012-12-25,添加天数为7,最后的运行结果为2013-01-01;
当输入日期为2000-2-28(闰年),添加天数为2,最后的运行结果为2000-03-01.

此题为牛客网上一例题,见下附链接:
日期累加

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值