今天做了一道C++课的作业题。题目很好理解,但是编写程序的过程却并没有想象中的简单,主要是相关算法的解决有一定难度(对于我自己而言)。虽然花费了几个小时时间,但最后Accepted的那一刻也真的是神清气爽。
题目:
实现一个日期类date,要重载两个date类之间的“-”运算以及date类的“+=”、“-=”运算。要求:
1.分别输入两个日期(年月日用空格隔开,且第一个日期的时间在第二个日期之前),输出两个日期相差的天数;
2.再次输入一个正整数(单位:天),输出第一个日期加上这个正整数的日期和第二个日期减去这个正整数的日期。
样例输入1:
1975 3 4
1980 4 29
15
样例输出1:
1883
1975 3 19
1980 4 14
样例输入2:
1980 2 28
2000 1 2
5
样例输出2:
7248
1980 3 4
1999 12 28
程序代码:
#include
using namespace std;
const int n1[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //包含闰年每月天数的常量数组
const int n2[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //包含平年每月天数的常量数组
class date
{
public:
int y,m,d;
date(int yy=0,int mm=0,int dd=0){y=yy;m=mm;d=dd;} //构造函数
int year() {return y;} //输出year函数
int month() {return m;} //输出month函数
int day() {return d;} //输出day函数
int operator - (const date &z) ; //成员函数声明:重载日期类 -运算 ——功能函数(甲)
date operator += (const int i) ; //成员函数声明:重载日期类+=运算 ——功能函数(乙)
date operator -= (const int i) ; //成员函数声明:重载日期类-=运算 ——功能函数(丙)
friend int frontday(int y,int m,int d); //友元函数声明:计算这一年已经过去多少天的函数 ——工具函数(1)
friend int backday(int y,int m,int d); //友元函数声明:计算这一年还剩多少天的函数 ——工具函数(2)
friend int yearmod(int y); //友元函数声明:判断某年是否为闰年,并返回其总天数的函数 ——工具函数(3)
friend int monthmod(int y,int m); //友元函数声明:判断某月是否为闰年2月,并返回其总天数的函数 ——工具函数(4)
friend int daymod(int y,int m1,int m2,int d1,int d2); //友元函数声明:计算同一年情况下两个日期之间的天数的函数 ——工具函数(5)
private:
};
int frontday(int y,int m,int d) //计算这一年已经过去多少天的函数 (1)
{
int sum=0;
int i;
if((y%100!=0&&y%4==0)||y%400==0) //闰年的情况
{
for(i=0;i<m-1;i++)
{
sum+=n1[i];
}
return sum+d;
}
else //平年的情况
{
for(i=0;i<m-1;i++)
{
sum+=n2[i];
}
return sum+d;
}
}
int backday(int y,int m,int d) //计算这一年还剩多少天的函数 (2)
{
int sum=0;
int i;
if((y%100!=0&&y%4==0)||y%400==0) //闰年的情况
{
for(i=0;i<m-1;i++)
{
sum+=n1[i];
}
return 366-(sum+d);
}
else //平年的情况
{
for(i=0;i<m-1;i++)
{
sum+=n2[i];
}
return 365-(sum+d);
}
}
int yearmod(int y) //判断某年是否为闰年,并返回其总天数的函数 (3)
{
if((y%100!=0&&y%4==0)||y%400==0) //闰年的情况
return 366;
else //平年的情况
return 365;
}
int monthmod(int y,int m) //判断某月是否为闰年2月,并返回其总天数的函数(4)
{
if((m==2)&&(y%4==0&&y%100!=0)||(y%400==0))
return 29;
else
return n2[m-1];
}
int daymod(int y,int m1,int m2,int d1,int d2) //计算同一年情况下两个日期之间的天数的函数 (5)
{
int sum=0;
int i;
if((y%100!=0&&y%4==0)||y%400==0) //闰年的情况
{
if(m1==m2) //两个日期同月的情况
{
return d2-d1;
}
else if((m2-m1)==1) //两个日期邻月的情况
{
return (n1[m1-1]-d1+d2);
}
else if((m2-m1)>1) //两个日期非同月或邻月的情况
{
sum=n1[m1-1]-d1+d2;
for(i=m1+1;i<=m2-1;i++)
{
sum+=n1[i-1];
}
return sum;
}
}
else //平年的情况
{
if(m1==m2) //两个日期同月的情况
{
return d2-d1;
}
else if((m2-m1)==1) //两个日期邻月的情况
{
return (n2[m1-1]-d1+d2);
}
else if((m2-m1)>1) //两个日期非同月或邻月的情况
{
sum=n2[m1-1]-d1+d2;
for(i=m1+1;i<=m2-1;i++)
{
sum+=n2[i-1];
}
return sum;
}
}
}
int date::operator - (const date &z) //重载日期类减法,返回相差的天数 ——功能函数(甲)
{
int t;
if((y-z.y)<0)
{
cout<<"data error!"<<endl;
}
else if((y-z.y)==0) //不跨年的情况
{
t=daymod(z.y,z.m,m,z.d,d);
return t;
}
else if((y-z.y)==1) //年份相邻的情况
{
t=backday(z.y,z.m,z.d)+frontday(y,m,d);
return t;
}
else if((y-z.y)>1) //年份不相邻的情况
{
int sum,i;
sum=backday(z.y,z.m,z.d)+frontday(y,m,d);
for(i=z.y+1;i<=y-1;i++)
{
sum+=yearmod(i);
}
return sum;
}
}
date date::operator += (const int i) //重载日期类+=运算 ——功能函数(乙)
{
date t;
if(i<0)
{
cout<<"data error!"<<endl;
}
else
{
d+=i;
while(d>monthmod(y,m))
{
d-=monthmod(y,m);
m++;
if(m==13)
{
y++;
m=1;
}
}
t.y=y;
t.m=m;
t.d=d;
return t;
}
}
date date::operator -= (const int i) //重载日期类-=运算 ——功能函数(丙)
{
date t;
if(i<0)
{
cout<<"data error!"<<endl;
}
else
{
d-=i;
while(d<1)
{
m--;
if(m==0)
{
y--;
m=12;
}
d+=monthmod(y,m);
}
t.y=y;
t.m=m;
t.d=d;
return t;
}
}
int main()
{
using std::cin;
using std::cout;
using std::endl;
date D1,D2;
int year;
int month;
int day;
cin>>year>>month>>day; //输入第一个日期
D1=date(year,month,day);
cin>>year>>month>>day; //输入第二个日期
D2=date(year,month,day);
cout<<D2-D1<<endl;
cin>>day; //输入要加减的天数
D1+=day;
D2-=day;
cout<<D1.year()<<" "<<D1.month()<<" "<<D1.day()<<endl;
cout<<D2.year()<<" "<<D2.month()<<" "<<D2.day()<<endl;
return 0;
}