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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。