日历 oop试题
(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);
}
}
}