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

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章