(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);
}
}
}