c++Date(日期)类方法实现日期计算器

1.日期类应该具有什么功能

计算两个日期间的间隔时间

给定一个日期,计算出减少x天数后的日期

给定一个日期,减少x天数后的日期

2.日期类的具体实现

需要注意的是:

为了提高的安全性,我只将要实现对象功能的方法放在了date的public区域中 而操作符重载函数还有一些其他不会被直接调用的函数我放到了private区域。 

为了锻炼自己的代码能力 我也将一些常用的date类操作符重载如'<' '>' '<=' ' >=' '='等一些操作符重载函数写了出来

date类代码具体如下

int const Year = 2022, Month = 4, Day = 9;
class Date{
public:
//设置默认构造函数
	 Date(int year = Year, int month = Month, int day = Day)
		 :_year(Year)//初始化
		 , _month(Month)
		 , _day(Day)//构造函数函数体内放的是赋值
	 {
		
		 if (IsLegal(year, month, day))//检验输入的日期是否合法
		 {
			 _year = year;
			 _month = month;
			 _day = day;
		 }
		 else
			 cout << "输入格式错误!" << endl<<"请重新输入该日期"<<endl;
	 }
	 void menu(){
		 cout << " 欢迎使用日期计算器    " << endl;
		 cout << " 1.计算两个日期间的间隔时间  " << endl;
		 cout << " 2.添加x天数后的日期." << endl;
		 cout << " 3.减少x天数后的日期." << endl;
		 cout << " 0.退出程序                      " << endl;
		 cout << "请输入命令序号!"           << endl;
	 }
	 void DateDV()//计算间隔时间
	 {
		 int datescale,year,month,day,flag=1;
		 while (flag){
			 cout << "请输入第一个日期" << endl;
			 cin >> datescale;
			 year = datescale / 10000;
			 month = (datescale % 10000) / 100;
			 day = datescale % 100;
			 if (IsLegal(year, month, day)){
				 flag = 0;
			 }
			 else
				 cout << "输入格式错误!" << endl << "请重新输入该日期" << endl;
		 }
		 Date date1(year, month, day);
		 flag = 1;
		 while (flag){
			 cout << "请再输入第二个日期" << endl;
			 cin >> datescale;
			 year = datescale / 10000;
			 month = (datescale % 10000) / 100;
			 day = datescale % 100;
			 if (IsLegal(year, month, day)){
				 flag = 0;
			 }
			 else
				 cout << "输入格式错误!" << endl << "请重新输入该日期" << endl;
		 }
		 Date date2(year, month, day);
		 int datedv = date1 - date2;		 
		 if (datedv < 0)
			 datedv = 0 - datedv;
		 cout << "两个日期相差"<<datedv<<"天" << endl;

	 }
	 void GetAddDate(){//计算增加X天后的日期
		 int datescale, year, month, day, flag = 1;
		 while (flag){
			 cout << "请输入一个日期" << endl;
			 cin >> datescale;
			 year = datescale / 10000;
			 month = (datescale % 10000) / 100;
			 day = datescale % 100;
			 if (IsLegal(year, month, day)){
				 flag = 0;
			 }
			 else
				 cout << "输入格式错误!" << endl << "请重新输入该日期" << endl;
		 }
		 Date n(year, month, day);
		 cout << "请输入要加的天数" << endl;
		 int days;
		 cin >> days;
		 n += days;
		 LetLegal(n);
		 n.Print();
	 }
	 void GetSubDate(){//计算减少X天后的日期
		 int datescale, year, month, day, flag = 1;
		 while (flag){
			 cout << "请输入一个日期" << endl;
			 cin >> datescale;
			 year = datescale / 10000;
			 month = (datescale % 10000) / 100;
			 day = datescale % 100;
			 if (IsLegal(year, month, day)){
				 flag = 0;
			 }
			 else
				 cout << "输入格式错误!" << endl << "请重新输入该日期" << endl;
		 }
		 Date n(year, month, day);
		 cout << "请输入要减去的天数" << endl;
		 int days;
		 cin >> days;
		 n -= days;
		 LetLegal(n);
		 n.Print();
	 }
	 
private:
	int _year;
	int _month;
	int _day;
	bool IsLegal(int year, int month, int day){		
		int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			arrm[2] += 1;
		if (year >= 0 && 1 <= month&&month <= 12&& 1 <= day &&day<= arrm[month])
			return true;
		else
			return false;
	}
	Date& operator=(const Date &n)//
	{
		_year = n._year;
		_month = n._month;
		_day = n._day;
		return *this;
	}
	Date operator++()
	{
		_day++;
		return *this;
	}
	Date operator++(int)
	{
		Date temp(*this);
		_day++;
		return temp;
	}
	//a+=b,即a=a+b;
	Date& operator+=(int days)
	{
		_day += days;
		return *this;
	}
	Date& operator-=(int days)
	{
		_day -= days;
		return *this;
	}
 Date operator-(int days)
	{

        Date temp(*this);
		temp._day--;
		return temp;
	}
	int operator-(const Date &n)//两个日期相减还剩多少天(具有正负)
	{
		int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		int ydv, dv, day1 = 0, day2 = 0;
		if ((_year / 4 == 0 && _year / 100 != 0) || _year / 400 == 0)
			arrm[2]++;
		for (int i = 1; i < _mouth; i++)
		{
			day1 += arrm[i];
		}
		day1 += _day;
		int arrm2[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		if ((n._year / 4 == 0 && n._year / 100 != 0) || n._year / 400 == 0)
			arrm2[2]++;
		for (int i = 1; i <n._mouth; i++)
		{
			day2 += arrm2[i];
		}
		day2 += n._day;
		ydv = _year - n._year;
		if (ydv == 0){
			dv = day1 - day2;
			return dv;
		}
		else if (ydv>0)
		{
			int count = 0;
			for (int year = _year - 1; year > n._year; year--){
				if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
					count++;
			}
			dv = ydv * 365 + count + (day1 - day2);
			return dv;
		}
		else{
			int count = 0;
			for (int year = n._year - 1; year > _year; year--){
				if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
					count++;

			}
			dv = -ydv * 365 + count + (day2 - day1);
			return 0 - dv;
		}


	}
	Date operator+(int days)
	{
		Date temp(*this);
        temp._day++;
		return temp;

	}
	bool operator==(const Date &n)
	{
		if (_year == n._year&&_month == n._month&&_day == n._day)
			return true;
		else
			return false;
	}
	bool operator<(const Date &n)
	{
		if (*this - n)
			return false;
		return true;
	}
	bool operator<=(const Date &n)
	{
		if (*this - n || *this - n == 0)
			return false;
		return true;
	}
	bool operator>(const Date &n)
	{
		if (*this - n)
			return true;
		return false;
	}
	bool operator>=(const Date &n)
	{
		if (*this - n || *this - n == 0)
			return true;
		return false;
	}
	void Print()
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
void	LetLegal(Date &n)
	{
	//如果日期格式错误,那么错误的地方一定在_day上
	int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	if (n._day>0)//_day>0
	{
		while (n._day > arrm[n._month]){
			if ((n._year % 4 == 0 && n._year / 100 != 0) || n._year % 400 == 0)
				arrm[2] ++;
			n._day -= arrm[n._month];
			if (n._month == 12){
				n._month = 1;
				n._year++;
				if(arrm[2]==29)arrm[2]--;
			}
			n._month++;	
		}
		return;
	}
	while (n._day < 0){
		if ((n._year / 4 == 0 && n._year / 100 != 0) || n._year / 400 == 0)
			arrm[2] ++;
		n._day += arrm[n._month - 1];
		if (n._month == 1){
			n._month = 12;
			n._year--;
			if (arrm[2] == 29)
				arrm[2]--;
		}
		n._month--;
	}
	return;
	}
};

3.主函数调用date方法实现date功能

int main()
{
	Date d1;
	d1.menu();
	int key;
	cin >> key;
	while (key){
		switch (key){
		case 1:
			d1.DateDV();
			break;
		case 2:
			d1.GetAddDate();
			break;
		case 3:
			d1.GetSubDate();
			break;
		case 0:
			break;
		default:
			cout << "error!" << endl;
			break;

	}
		if (key != 0){
			cout << "请输入命令序号" << endl;
		}
		cin >> key;
		if (key != 0){
			system("cls");
			d1.menu();
		}
}	
	system("pause");
	return 0;
}

作者目前C++仍处于学习阶段,代码中可能会有一些地方的语法复杂累赘,欢迎大家在评论区给予指正!

(1) 测试日期成员函数,在主函数中列出菜单选项,可以完成日期的加减比较等测试功能。 (2) 完善程序功能,在日期相加的菜单选项中增加日期加天数,结果为新日期日期家月份,结果为新日期,要考虑闰年情况。 (3) 完善程序功能,在日期相减的菜单选项中增加日期减天数,结果为新日期日期减月份,结果为新日期,要考虑闰年情况。 (4) 显示日期时增加显示星期及英文形式的月份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。 (1) 仿照日期编写时间CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时的时间格式。 (4) 编写时间和日期的派生CDati,完成日期与时间的联合设置、运算、比较等功能,要求该派生可以完成:日期时间加天数或时间等于新的日期时间,日期时间减天数或等于新的日期时间,两个日期时间相减等于天数或时间等工作,在程序中考虑闰年等具体情况,并重载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有为青年_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值