(20 分)设计一个日期类 Date, 要求:
(1) 公元前年份的表达方式遵守 ISO8601 标准:公元 1 年为 1,公元前 1 年为 0,公
元前 2 年为-1,以此类推;
(2) 在 1752 年 9 月 2 日之前使用儒略历,其后一天起使用格利历,调整为 1752 年 9
月 14 日;
(3) 提供转换构造函数,把整数转成日期,规则为整数代表 1970-01-01 加上此整数
天数的日期;
(4) 提供构造函数,接受三个整数分别代表年、月、日三个字段;
(5) 重载<, >, ==, 可以比较两天的大小,例如 2016-04-28 > 2016-04-27 为 true
(6) 重载+, -,可以对一个日期加/减一个整数, 整数的含义为天数,
例如, 2016-04-28 + 1 = 2016-04-29,
二个日期类之间可以做减法,结果为相差的天数,
例如, 2016-04-29 – 2016-04-27 = 2
(7) 重载<<以便使用 cout 输出,输出格式为 ISO8601 标准,即 YYYY-MM-DD,不足
位时补 0。
#include <iostream> using namespace std; class Date() { int year,month,day,days; public: Date(int days); Date(int year,int month,int day); bool operator<(const Date t)const; bool operator>(const Date t)const; bool operator==(const Date t)const; Date operator+(const Date t); Date operator-(const Date t); friend ostream& operator<<(ostream& os,const Date& dt); }; int getDaysInMounth(int m,bool isLeapyear); int getDaysInYear(int year); bool isLeapyear(int year); int getDays(int year,int mounth,int day); void getDate(int& year,int& mounth,int& day,int days); bool isValid(int year,int month,int day); ostream& operator<<(ostream& os,const Date& dt) { int year=dt.year,month=dt.month,day=dt.day; if(year<0) os<<"-"; if(abs(year)<10) os<<"000"; else if(abs(year)<100) os<<"00"; else if(abs(year)<1000) os<<"0"; os<<year<<"-"; if(month<10) os<<"0"; os<<month<<"-"; if(day<10) os<<"0"; os<<day<<endl; return os; } bool isValid(int year,int month,int day) { if(month>=1&&month<=12) { if(day>=1&&day<=getDaysInMounth(month)) return true; } return false; } bool isLeapyear(int year) { if(year<=1752) { if(year%4==0) return true; else return false; } else { if(year%100==0) { if(year%400==0) return true; else return false; } else { if(year%4==0) return true; else return false; } } } int getDaysInMounth(int m,bool isLeapyear) { switch(m){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31; case 4:case 6:case 9:case 11: return 30; case 2: return isLeapyear?29:28; } } int getDaysInYear(int year) { if(isLeapyear(year)) return 366; else return 365; } int getDays(int year,int mounth,int day)//days=0 是1970年的时候 { int days=0; if(year<1970) { for(int i=1;i<=year;i++) { days-=getDaysInYear(year); } for(int i=1;i<=month;i++) { days-=getDaysInMounth(month); } } else { for(int i=1;i<=year-1;i++) { days+=getDaysInYear(year); } for(int i=1;i<=month-1;i++) { days+=getDaysInMounth(month,isLeapyear(year)); } } bool isJiuli=false; if(year==1752){ if(month==9) { if(day<14) { isJiuli=true; } } else if(month<9) { isJiuli=true; } } else if(year<1752) { isJiuli=true; } if(isJiuli) days+=11; days+=day-1; return days; } void getDate(int& year,int& mounth,int& day,int days) { int startYear=1970; int yearOfdays; if(days<0) { if(days<getDays(1752,9,2))//旧历比新历多了11天因为按照旧历9月3号 的人成为了新历9月14号的人 就像是时空穿越一样这样子人的生命就有11天不见了,所以旧历的人的生命多了11天,所以旧历比新历多了11天// { days-=11;//多了11天 记住days是减号 } startYear--; yearOfdays=getDaysInYear(startYear); while(day<0); { startYear--; day+=yearOfdays; yearOfdays=getDaysInYear(startYear); } } }