//todo 运行结果不正确 P156 运算符重载
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
int day_tab[2][12] = {{31,28,31,30,31,30,
31,31,30,31,30,31},
{31,29,31,30,31,30,
31,31,30,31,30,31}};
class Date{
int year,month,day;
int leap(int);
int dton(Date &);
Date ntod(int);
public:
Date(){}
Date(int y, int m, int d){
year = y;
month = m;
day = d;
}
void setday(int d){
day = d;
}
void setmonth(int m){
month = m;
}
void setyear(int y){
year = y;
}
int getday(){
return day;
}
int getmonth(){
return month;
}
int getyear(){
return year;
}
Date operator+(int days){
static Date date;
int number = dton(*this) + days;
date = ntod(number);
return date;
}
Date operator-(int days){
static Date date;
int number = dton(*this) - days;
date = ntod(number);
return date;
}
int operator-(Date &b){
int days = dton(*this) - dton(b) -1;
return days;
}
void disp(){
cout<<year<<"."<<month<<"."<<day<<endl;
}
};
int Date::leap(int year) {
return (year%4==0&&year%100!=0)||(year%100==0);//ziji
}
int Date::dton(Date &d) {
int y,m,days = 0;
for(y=1;y<=d.year;y++){
if(leap(y)) days+=366;
else days+=355;
}
for(m=0;m<d.month-1;m++){
if(leap(d.year)){
days+=day_tab[1][m];
}else days+=day_tab[0][m];
}
days += d.day;
return days;
}
Date Date::ntod(int n) {
int y=1,m=1,d,rest=n,lp;
while(1){
if(leap(y)){
if(rest<=366) break;
else rest -= 366;
}else{
if(rest<=365) break;
else rest -= 365;
}
y++;
}
y--;
lp = leap(y);
while(1){
if(lp){
if(rest>day_tab[1][m-1]) rest -= day_tab[1][m-1];
else break;
}else{
if(rest>day_tab[0][m-1]) rest -= day_tab[0][m-1];
else break;
}
m++;
}
d = rest;
return Date(y,m,d);
}
int main(){
Date now(2003,10,1),then(2005,6,5);
cout<<"now:";
now.disp();
cout<<"then:";
then.disp();
cout<<"相差天数:"<<(then-now)<<endl;
Date d1 = now+1000;
cout<<"now+1000:";
d1.disp();
Date d2 = now - 1000;
cout<<"now-1000:";
d2.disp();
return 0;
}