zoukankan      html  css  js  c++  java
  • 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();	
      }
    
    
  • 相关阅读:
    BZOJ 2565 最长双回文串 (Manacher)
    BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
    BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
    BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)
    BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
    luogu P5289 [十二省联考2019]皮配
    luogu P5285 [十二省联考2019]骗分过样例
    luogu P5294 [HNOI2019]序列
    luogu P5292 [HNOI2019]校园旅行
    luogu P5284 [十二省联考2019]字符串问题
  • 原文地址:https://www.cnblogs.com/vivid-victory/p/10090484.html
Copyright © 2011-2022 走看看