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

优质内容筛选与推荐>>
1、业务实体的一些思路
2、【原】文本图片自适应高度小bug以及解决办法
3、【算法讲解】三分法
4、VS2008中Web项目的App_Code目录问题
5、安装mysql8.0.11以及修改root密码、连接navicat for mysql。


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号