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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM