将专栏中上一篇文章用面向对象的方式实现
代码如下:
#include <bits/stdc++.h>
using namespace std;
class Date
{
private:
int year,month,day;
public:
Date(int year=0,int month=0,int day=0)
{
this->year=year,this->month=month,this->day=day;
}
void AddDays(int days)
{
for(int i=days; i; --i)
{
if(day==31)
{
if(month-12)
{
month++;
day=1;
}
else
{
year++;
month=1;
day=1;
}
continue;
}
if(day==30)
{
if(month==4||month==6||month==9||month==11)
{
month++;
day=1;
}
else
day++;
continue;
}
if(day==29&&month==2)
{
month++;
day=1;
continue;
}
if(day==28&&month==2)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
day++;
else
{
month++;
day=1;
}
continue;
}
day++;
}
}
void AddMonth(int months)
{
year+=(month+months)/12;
month=(month+months)%12;
if(day==31)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return;
if(month==4||month==6||month==9||month==11)
{
day=30;
return;
}
if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
day=29;
return;
}
day=28;
return;
}
if(day==30&&month==2)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
day=29;
return;
}
day=28;
return;
}
if(day==29&&month==2)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
return;
day=28;
return;
}
}
void AddYear(int years)
{
year+=years;
if(day==29&&month==2)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
return;
day=28;
return;
}
}
int DayInYear(int Year,int Month)
{
int Long=0;
int DAY[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
if(((Year%4==0)&&(Year%100!=0))||(Year%400==0))
DAY[1]=29;
for(int i=0; i<Month-1; ++i)
{
Long+=DAY[i];
}
return Long;
}
int Subtract(Date d)
{
if(year==d.year&&month==d.month)
{
return day-d.day;
}
else if(year==d.year)
{
return DayInYear(year,month) - DayInYear(d.year,d.month);
}
else
{
int a,b,c=0;
int temp1,temp2,temp3;
int flag=0;
if(year>d.year)
{
temp1=year;
year=d.year;
d.year=temp1;
temp2=month;
month=d.month;
d.month=temp2;
temp3=day;
day=d.day;
d.day=temp3;
flag=1;
}
if(((year%4==0)&&(year%100!=0))||(year%400==0))
a=366-DayInYear(year,month);
else
a=365-DayInYear(year,month);
b=DayInYear(d.year,d.month);
for(int i=year+1; i<d.year; ++i)
{
if(((i%4==0)&&(i%100!=0))||(i%400==0))
c+=366;
else
c+=365;
}
return flag?(a+b+c):(-a-b-c);
}
}
int GetYear()
{
return year;
}
int GetMonth()
{
return month;
}
int GetDay()
{
return day;
}
};
int main()
{
int op;
while(cin>>op)
{
int n;
int year1,month1,day1,year2,month2,day2;
if(op!=4)
{
cin>>year1>>month1>>day1>>n;
Date d1(year1,month1,day1);
if(op==1)
{
d1.AddDays(n);
cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl;
}
if(op==2)
{
d1.AddMonth(n);
cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl;
}
if(op==3)
{
d1.AddYear(n);
cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl;
}
}
else
{
cin>>year1>>month1>>day1>>year2>>month2>>day2;
Date d1(year1,month1,day1);
Date d2(year2,month2,day2);
n=d1.Subtract(d2);
cout<<n<<endl;
}
}
return 0;
}