C++设计一个CDate日期类,实现加减天数操作

熟悉类和对象

1.实验题目

设计一个CDate日期类

2.实验目的

熟悉类和对象的设计,能够设计出类

3.要求:

CData类中包含年月日,能够输入输出,并实现加减天数操作。

内容如下:

/*

没有考虑很多异常输入输出情况

肯定会有不足,欢迎有机会看到这篇文章并觉得哪些地方可以改进的朋友指出

*/

  #include <iostream>
  using namespace std;
  
  class CDate {
        private:
                int year,month,day;
        public:
                CDate();                 //无参构造函数 
                CDate(int year1,int month1,int day1);
                ~CDate();
                int ifleapyear();
                void print();
                void adddays(int i);
                void subdays(int i);
  };
  
  CDate::CDate(){                
                year=2000;
                month=1;
                day=1;
        }
  CDate::CDate(int year1,int month1,int day1) {
  //        cout<<"构造函数使用中"<<endl;
        year=year1;
        month=month1;
        day=day1;
  }
  
  CDate::~CDate() {
        //cout<<"析构函数使用中"<<endl;
  }
  
  int CDate::ifleapyear() {
        if((year%4==0&&year%100!=0)||year%400==0)
        return 1;
        else return 0;   
        
  }
  
  void CDate::print() {
        cout<<"当前日期:"<<year<<"年"<<month<<"月"<<day<<"日" <<endl;
  }
  
  void CDate::adddays(int i)
  {
        int months[13]= {-1,31,28,31,30,31,30,31,31,30,31,30,31};
        while(i>=365)//考虑数字很大时的处理情况 
        {
                if(month>=3)//三月及以上考虑的是第二年的闰年情况,先++ 
                {                                           
                        year++;
                        if(ifleapyear())
                        i=i-366;     //后面有关于i为负数的处理 
                        else i=i-365;
                }
                if(month<=2)//二月及以下考虑当年闰年影响,后++ 
                {
                        if(ifleapyear())
                        i=i-366;
                        else i=i-365;
                        year++;
                }        
        }
        while(i>=28)//考虑月份,这里考虑i>=28是希望在后面的日子的处理过程中最多只变换一次月份 
        {
                if(ifleapyear()&&month==2)//闰月处理情况(这里和前面关于闰年的处理没有重复处理)
                        i=i-29;
                else i=i-months[month]; 
                month++;
            if(month>12) 
            {
                month=1;
                year++;
                }
        }
        if((day+i)>months[month])//日子和最后要加的天数超过所在月的处理情况 
        {                
                if(ifleapyear()&&month==2)//时时要想闰年的处理 
                        i=i-29;
                i=i-months[month];
                if(month==12)
                {
                        month=1;
                        year++;
                }
                else month++;
  
        }
        day=day+i;
        if(day<=0)//这里考虑在之前处理中i为负数且day很小的情况下导致day为负数的情况 
        {
                if(month==1)
                {
                        year--;
                        month=12;
                 } 
                else month--;
                if(ifleapyear()&&month==2)//刻刻要想闰年的处理
                        day=29+day;
                day=months[month]+day;
        }        
  }
  
  void CDate::subdays(int i)
  {
        int months[13]= {-1,31,28,31,30,31,30,31,31,30,31,30,31};
        while(i>=365)//考虑数字很大时的处理情况 
        {
                if(month<=2)//二月及以下考虑的是前一年的闰年情况,先-- 
                {                                           
                        year--;
                        if(ifleapyear())
                        i=i-366;     //后面有关于i为负数的处理 
                        else i=i-365;
                }
                if(month>=3)//三月及以上考虑当年闰年影响,后-- 
                {
                        if(ifleapyear())
                        i=i-366;
                        else i=i-365;
                        year--;
                }        
        }
        while(i>=28)//考虑月份,这里考虑i>=28是希望在后面的日子的处理过程中最多只变换一次月份 
        {
                if(month==1) 
            {
                month=12;
                year--;
                i=i-31;
                }
                else{
                        if(ifleapyear()&&month==3)//闰月处理情况
                        i=i-29;
                        else i=i-months[month-1]; 
                        month--;
                }
        }        
        if((day-i)<=0)//日子减去天数小于0的处理情况 
        {
                if(month==1)
                {
                        month=12;
                        year--;
                }
                else month--;     
                if(ifleapyear()&&month==2) //时时要想闰年的处理 
                        i=i-29;
                i=i-months[month];
        }
        day=day-i;
        /*
                day=26,i=27,day-i=-1;
                month=4,i=i-31=-4;
                month=3
                day=26-(-4)=30;--> 3 30
                在i<28,day-i<0的情况下, 
                day=day-i+month<month
                进入上面判断if((day-i)<=0)
                不会再进入下面 if(day>=months[month])
        */ 
        if(day>=months[month])
        {
                if(ifleapyear()&&month==2) //刻刻要想闰年的处理
                        day=day-29;
                day=day-months[month];
                if(month==12)
                {
                        year++;
                        month=1;
                 } 
                else month++;
        }        
  }
  
  int main() 
  {
        int year0,month0,day0,n;
        cout<<"输入今天的日期:";
        cin>>year0>>month0>>day0; 
        CDate date0(year0,month0,day0);  
        date0.print();
  
        cout<<"请输入你要增加的天数:";
        cin>>n;
        date0.adddays(n);
        date0.print();  
  
        cout<<"请输入你要减少的天数:";
        cin>>n;
        date0.subdays(n);
        date0.print();  
  }