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.
此题为牛客网上一例题,见下附链接:
日期累加