G 日期运算

G 日期运算

时间: 1ms        内存:128M

描述:

设计日期类(Date),重载下列运算符实现相关操作
(1) 使用成员函数重载 “-”, 实现求两个日期相差的天数
(2) 使用成员函数重载 “+”,实现日期和天数的相加 (加的天数最多31天)

 注意:为了降低该题的难度,程序的运行都在是以下输入限定下进行:
 (1)输入的年月日都是合法的年月日
 (2)进行两个日期相减操作时,输入的第一个日期大于第二个日期,从而得到的天数都是正的
 (3)日期和天数相加时,输入的天数大于等于0且小于等于31

请在下面的程序段基础上根据要求完成设计,只提交begin到end部分的代码

注意:Date类的数据成员以及部分成员函数已经给出,请给Date类添加其余成员函数来完成相应功能
 

# include <iostream>
using namespace std;

//****************begin**************************

class Date
{
public:
 Date(int y=2000,int m=1,int d=1); //带三个参数的声明造函数声明
  void show(); //按照“年-月-日”的方式显示日期的函数声明
  //添加其它成员函数声明,并在类外进行定义
private:
  int year,month,day;
};
 

//*******************end*********************

Date::Date(int y,int m,int d) //带有三个参数的构造函数,给出的三个参数是合法的年月日
{
 year=y;
 month=m;
 day=d;
}

void Date::show()  //按照“年-月-日”的方式显示日期
{
 cout<<year<<"-"<<month<<"-"<<day<<endl;
}

int main()
{
 int year1,month1,day1;
 int year2,month2,day2;
    int days;

 cin>>year1>>month1>>day1; //输入第一个日期的年、月、日
    Date d1(year1,month1,day1); //创建第一个日期对象
 
 cin>>year2>>month2>>day2; //输入第二个日期的年、月、日

    Date d2(year2,month2,day2); //创建第二个日期对象
 
 cout<<(d1-d2)<<endl; //输出两个日期的相差的天数

 cin>>days; //输入第一个日期要加的天数(days大于等于0且小于等于31)
 d1=d1+days;  //实现日期和天数的相加操作
 d1.show();  //按照“年-月-日”的方式显示日期

    return 0;
}

输入:

输入日期1的年、月、日
输入日期2的年、月、日
输入日期1要加的天数(大于等于0且小于等于31)

输出:

输出日期1和日期2之间相差的天数
输出日期1和天数相加后新日期的年、月、日

示例输入:

2005 4 3
2004 1 28
28

示例输出:

431
2005-5-1

提示:

参考答案(内存最优[1504]):


# include <iostream>
using namespace std;

//****************begin**************************

class Date
{
public:
	Date(int y=2000,int m=1,int d=1); //带三个参数的构造函数
	int operator - (Date & date2); //成员函数重载 “-”,获取两个日期相差的天数
	Date operator + (int num); //成员函数 完成Date+int
	int daycount();//计算日期从1年1月1日开始到当前日期的总天数
	void adjust(); //调整日期函数
	void show(); //按照“年-月-日”的方式显示日期
private:
	int year,month,day;
};


bool isLeapYear(int i) //判断是否是闰年
{
	return ( i%4 == 0 && i%100 != 0 )||( i%400 == 0); 
}


void Date::adjust() //调整函数,如果闰年,调整二月份天数为29天
{
	int Month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(year)) //如果闰年,调整二月份天数为29天
		Month[2]++;
    if(day>Month[month])  //如果day大于每月的总天数,调整该日期
	{	day-=Month[month];
		month++;
        if(month==13)
	    {
		  month=1;
		  year++;
	    }
	}	
}

Date Date::operator + (int num)  //成员函数 完成Date+int
{	Date temp;
	temp.year=year;
	temp.month=month;
	temp.day=day+num;
	temp.adjust();  //调整日期
	return temp;
}

int Date::daycount()  //计算日期从1年1月1日开始到当前日期的总天数
{
	int dayOfMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},i,sum=0;
	for(i=1;i<month;i++)
		sum+=dayOfMonth[i];
	sum+=day;
	if(month>2&&isLeapYear(year))  //如果月份大于2且是闰年,天数增1
		sum+=1;
	for(i=1;i<year;i++)
	{
		if(isLeapYear(i))    //如果当前年是闰年则此年总天数是366天
			sum+=366;   
		else                 //如果当前年是非闰年则此年总天数是366天
			sum+=365;
	}
	return sum; 
}

int Date::operator -(Date & date2) //日期相差天数,减法,成员函数
{
     //return (*this).daycount()-date2.daycount();
	return daycount()-date2.daycount();
}
 

//*******************end*********************

Date::Date(int y,int m,int d) //带有三个参数的构造函数,给出的三个参数是合法的年月日
{
 year=y;
 month=m;
 day=d;
}

void Date::show()  //按照“年-月-日”的方式显示日期
{
 cout<<year<<"-"<<month<<"-"<<day<<endl;
}


int main()
{
 int year1,month1,day1;
 int year2,month2,day2;
    int days;

 cin>>year1>>month1>>day1; //输入第一个日期的年、月、日
    Date d1(year1,month1,day1); //创建第一个日期对象
 
 cin>>year2>>month2>>day2; //输入第二个日期的年、月、日

    Date d2(year2,month2,day2); //创建第二个日期对象
 
 cout<<(d1-d2)<<endl; //输出两个日期的相差的天数

 cin>>days; //输入第一个日期要加的天数(days大于等于0且小于等于31)
 d1=d1+days;  //实现日期和天数的相加操作
 d1.show();  //按照“年-月-日”的方式显示日期

    return 0;
}


参考答案(时间最优[0]):


# include <iostream>
using namespace std;

//****************begin**************************

class Date
{
public:
	Date(int y=2000,int m=1,int d=1); //带三个参数的构造函数
	int operator - (Date & date2); //成员函数重载 “-”,获取两个日期相差的天数
	Date operator + (int num); //成员函数 完成Date+int
	int daycount();//计算日期从1年1月1日开始到当前日期的总天数
	void adjust(); //调整日期函数
	void show(); //按照“年-月-日”的方式显示日期
private:
	int year,month,day;
};


bool isLeapYear(int i) //判断是否是闰年
{
	return ( i%4 == 0 && i%100 != 0 )||( i%400 == 0); 
}


void Date::adjust() //调整函数,如果闰年,调整二月份天数为29天
{
	int Month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(isLeapYear(year)) //如果闰年,调整二月份天数为29天
		Month[2]++;
    if(day>Month[month])  //如果day大于每月的总天数,调整该日期
	{	day-=Month[month];
		month++;
        if(month==13)
	    {
		  month=1;
		  year++;
	    }
	}	
}

Date Date::operator + (int num)  //成员函数 完成Date+int
{	Date temp;
	temp.year=year;
	temp.month=month;
	temp.day=day+num;
	temp.adjust();  //调整日期
	return temp;
}

int Date::daycount()  //计算日期从1年1月1日开始到当前日期的总天数
{
	int dayOfMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},i,sum=0;
	for(i=1;i<month;i++)
		sum+=dayOfMonth[i];
	sum+=day;
	if(month>2&&isLeapYear(year))  //如果月份大于2且是闰年,天数增1
		sum+=1;
	for(i=1;i<year;i++)
	{
		if(isLeapYear(i))    //如果当前年是闰年则此年总天数是366天
			sum+=366;   
		else                 //如果当前年是非闰年则此年总天数是366天
			sum+=365;
	}
	return sum; 
}

int Date::operator -(Date & date2) //日期相差天数,减法,成员函数
{
     //return (*this).daycount()-date2.daycount();
	return daycount()-date2.daycount();
}
 

//*******************end*********************

Date::Date(int y,int m,int d) //带有三个参数的构造函数,给出的三个参数是合法的年月日
{
 year=y;
 month=m;
 day=d;
}

void Date::show()  //按照“年-月-日”的方式显示日期
{
 cout<<year<<"-"<<month<<"-"<<day<<endl;
}


int main()
{
 int year1,month1,day1;
 int year2,month2,day2;
    int days;

 cin>>year1>>month1>>day1; //输入第一个日期的年、月、日
    Date d1(year1,month1,day1); //创建第一个日期对象
 
 cin>>year2>>month2>>day2; //输入第二个日期的年、月、日

    Date d2(year2,month2,day2); //创建第二个日期对象
 
 cout<<(d1-d2)<<endl; //输出两个日期的相差的天数

 cin>>days; //输入第一个日期要加的天数(days大于等于0且小于等于31)
 d1=d1+days;  //实现日期和天数的相加操作
 d1.show();  //按照“年-月-日”的方式显示日期

    return 0;
}


题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注