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