【C++】【CDate类的初接触】

之前的话,只是简单的学习了一下c++的STL,方便进行acm的解题,并没有真正的去接触这个东西,没有深入的去了解C++究竟是什么,大二上学期接触了C++面向对象的程序设计语言,正式的打开了学习C++的大门。

实话可能是感觉之前有一些C++的基础,总感觉老师讲的并不是很难,但是当老师叫我们手写一个CDate类的时候,真的是遇到了一些难度,不知道什么时候养成的坏习惯,就是越来越不喜欢动脑袋了,不管是数据结构还是matlab都是简单的思考,之后就搜索题解,然而,今天老师提的问题是比较全面的,所以我只好自己手写一波。

CDate类实现的功能是:

1.增加/减少 一天

2.增加/减少很多天

3.判断两个CDate类的时间差

中间涉及的小细节有很多:一 要考虑闰年的存在,即2月份是28 29不定的,然后就是所谓的1 3 5 7 9 10 12是大月,别的除了二月是小月。

首先给一下老师给的代码;

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

class CDate{
private:
	int year,month,day;
public:
	CDate()
	{
		year=2018;
		month=11;
		day=5;
	}
	CDate(int y,int m,int d)
	{
		year=y;
		month=m;
		day=d;
	}
	~CDate()
	{
		cout<<"析构函数进行中"<<endl;
	}
	void print()
	{
		cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
	}
	bool Leapyear()
	{
		if((year%4==0&&year%100!=0)||year%400==0)
			return true;
		else
			return false;
	}
	void AddOneDay()
	{
		if(++day>GetDays())
		{
			day=1;
			if(++month>12)
			{
				month=1;
				year++;
			}
		}
	}
	void SubOneDay()
	{
		if(--day==0)
		{
			if(--month==0)
			{
				month=12;
				year--;
			}
			day=GetDays();
		}
	}
	void AddDays(int i)
	{
		for(int ii=0;ii<i;ii++)
		{
			AddOneDay();
		}
	}
	void SubDays(int i)
	{
		for(int ii=0;ii<i;ii++)
		{
			SubOneDay();
		}
	}
	int GetDays()
	{
		int days=0;
		switch(month)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12: days=31;break;
			case 4:
			case 6:
			case 9: 
			case 11: days=30;break;
			case 2: if((year%4==0)&&(year%100!=0)||(year%400)==0) days=29;
					else days=28;
		}	
		return days;		
	}
};

int main()
{
	CDate d1(2018,11,6);
	d1.AddOneDay();
	d1.print();
	d1.AddDays(300);
	d1.print();
	d1.SubDays(300);
	d1.print();
	return 0;
}

代码已经很完善了,但是有一个比较大的缺点就是计算相差天数的时候是两个之间的中间变量一天天的累加或者累减,特别繁琐,但是是可以实现的(这个代码没有涉及两个CDate类之间的天数差值)。只是不是最优优化,后来又增加了需求进行了优化,直接GetDays的形参设置为每月的月份,输出值的话就是该月份的天数。

优化后的代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

class CDate{
private:
	int year,month,day;
public:
	CDate()
	{
		year=2018;
		month=11;
		day=5;
	}
	CDate(int y,int m,int d)
	{
		year=y;
		month=m;
		day=d;
	}
	~CDate()
	{
		cout<<"析构函数进行中"<<endl;
	}
	void print()
	{
		cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
	}
	bool Leapyear()
	{
		if((year%4==0&&year%100!=0)||year%400==0)
			return true;
		else
			return false;
	}
	void AddOneDay()
	{
		if(++day>GetDays(month))
		{
			day=1;
			if(++month>12)
			{
				month=1;
				year++;
			}
		}
	}
	void SubOneDay()
	{
		if(--day==0)
		{
			if(--month==0)
			{
				month=12;
				year--;
			}
			day=GetDays(month);
		}
	}
	void AddDays(int i)
	{
		// for(int ii=0;ii<i;ii++)
		// {
		// 	AddOneDay();
		// }
		while(i+day>GetDays(month))
		{
			i=i+day-GetDays(month);
			day=0;
			month++;
			if(month>12)
			{
				year++;
				month=1;
			}
		}
		day=day+i;
		if(day>GetDays(month))
		{
			day=day-GetDays(month);
			month++;
			if(month>12)
			{
				year++;
				month=1;
			}
		}
	}
	void SubDays(int i)
	{
		// for(int ii=0;ii<i;ii++)
		// {
		// 	SubOneDay();
		// }
		while(i>day)
		{
			i=i-day;
			month--;
			if(month<1)
			{
				year--;
				month=12;
			}
			day=GetDays(month);
		}
		day=day-i;
		if(day<1)
		{
			month--;
			if(month<1)
			{
				year--;
				month=12;
			}
			day=GetDays(month)+day;
		}
	}
	int GetDays(int monthss)
	{
		int days;
		switch(monthss)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12: days=31;break;
			case 4:
			case 6:
			case 9: 
			case 11: days=30;break;
			case 2: if((year%4==0)&&(year%100!=0)||(year%400)==0) days=29;
					else days=28;
		}	
		return days;		
	}
	int SubDate(CDate &b)
	{
		int minx=min(month,b.month);
		int maxx=max(month,b.month);
		int sum=0;
		for(int i=minx;i<maxx;i++)
		{
			sum+=GetDays(i);
		}
		minx=min(day,b.day);
		maxx=max(day,b.day);
		sum+=(maxx-minx);
		printf("%d\n",sum);
	}
};

int main()
{
	CDate d1(2018,3,6);
	CDate d2(2018,4,6);
	d1.AddOneDay();
	d1.print();
	d1.AddDays(300);
	d1.print();
	d1.SubDays(300);
	d1.print();
	d1.SubDate(d2);
	return 0;
}

总结:第一次设计这种类的实现,可能不是最优的存在,请大佬们积极指出。= =

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值