熟悉類和對象
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();
}