日历 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);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/lirui7610/article/details/80098656