【C++】日期类相减及其“+=”、“-=”运算符的重载

今天做了一道C++课的作业题。题目很好理解,但是编写程序的过程却并没有想象中的简单,主要是相关算法的解决有一定难度(对于我自己而言)。虽然花费了几个小时时间,但最后Accepted的那一刻也真的是神清气爽。

题目:
实现一个日期类date,要重载两个date类之间的“-”运算以及date类的“+=”、“-=”运算。要求:
1.分别输入两个日期(年月日用空格隔开,且第一个日期的时间在第二个日期之前),输出两个日期相差的天数;
2.再次输入一个正整数(单位:天),输出第一个日期加上这个正整数的日期和第二个日期减去这个正整数的日期。

样例输入1:

1975 3 4
1980 4 29
15

样例输出1:

1883
1975 3 19
1980 4 14

样例输入2:

1980 2 28
2000 1 2
5

样例输出2:

7248
1980 3 4
1999 12 28

程序代码:

#include <iostream>
using namespace std;
const int n1[12]={31,29,31,30,31,30,31,31,30,31,30,31};  //包含闰年每月天数的常量数组 
const int n2[12]={31,28,31,30,31,30,31,31,30,31,30,31};  //包含平年每月天数的常量数组 
class date
{
	public:
		int y,m,d;
		date(int yy=0,int mm=0,int dd=0){y=yy;m=mm;d=dd;} //构造函数 
		
		int year()  {return y;}  //输出year函数
		int month() {return m;}  //输出month函数 
		int day()   {return d;}  //输出day函数 

	    int operator - (const date &z) ;        //成员函数声明:重载日期类 -运算  ——功能函数(甲)
		date operator += (const int i) ;        //成员函数声明:重载日期类+=运算  ——功能函数(乙) 
		date operator -= (const int i) ;        //成员函数声明:重载日期类-=运算  ——功能函数(丙)
		  
		friend int frontday(int y,int m,int d);                    //友元函数声明:计算这一年已经过去多少天的函数              ——工具函数(1)
		friend int backday(int y,int m,int d);                     //友元函数声明:计算这一年还剩多少天的函数                  ——工具函数(2) 
		friend int yearmod(int y);                                 //友元函数声明:判断某年是否为闰年,并返回其总天数的函数    ——工具函数(3)
		friend int monthmod(int y,int m);                          //友元函数声明:判断某月是否为闰年2月,并返回其总天数的函数 ——工具函数(4)
		friend int daymod(int y,int m1,int m2,int d1,int d2);      //友元函数声明:计算同一年情况下两个日期之间的天数的函数    ——工具函数(5)

	private:
};

int frontday(int y,int m,int d)  //计算这一年已经过去多少天的函数 (1) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0) //闰年的情况 
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n1[i];
		}
		return sum+d;
	}
	else                             //平年的情况 
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n2[i];
		}
		return sum+d;
	}
}

int backday(int y,int m,int d)  //计算这一年还剩多少天的函数 (2) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0)  //闰年的情况 
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n1[i];
		}
		return 366-(sum+d);
	}
	else                              //平年的情况 
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n2[i];
		}
		return 365-(sum+d);
	}
}

int yearmod(int y)  //判断某年是否为闰年,并返回其总天数的函数 (3) 
{
	if((y%100!=0&&y%4==0)||y%400==0)  //闰年的情况 
	return 366;
	else                              //平年的情况 
	return 365;
}

int monthmod(int y,int m)  //判断某月是否为闰年2月,并返回其总天数的函数(4) 
{
	if((m==2)&&(y%4==0&&y%100!=0)||(y%400==0))
	return 29;
	else
	return n2[m-1];
}

int daymod(int y,int m1,int m2,int d1,int d2)  //计算同一年情况下两个日期之间的天数的函数 (5) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0)                //闰年的情况 
	{
		if(m1==m2)           //两个日期同月的情况 
		{
			return d2-d1; 
		}
		else if((m2-m1)==1)  //两个日期邻月的情况 
		{
			return (n1[m1-1]-d1+d2); 
		}
		else if((m2-m1)>1)   //两个日期非同月或邻月的情况
		{
			sum=n1[m1-1]-d1+d2;
			for(i=m1+1;i<=m2-1;i++)
			{
				sum+=n1[i-1];
			}
			return sum;
		} 
	}
	else                                            //平年的情况 
	{
		if(m1==m2)           //两个日期同月的情况 
		{
			return d2-d1; 
		}
		else if((m2-m1)==1)  //两个日期邻月的情况 
		{
			return (n2[m1-1]-d1+d2); 
		}
		else if((m2-m1)>1)   //两个日期非同月或邻月的情况
		{
			sum=n2[m1-1]-d1+d2;
			for(i=m1+1;i<=m2-1;i++)
			{
				sum+=n2[i-1];
			}
			return sum;
		} 
	}
}

int date::operator - (const date &z) //重载日期类减法,返回相差的天数 ——功能函数(甲) 
{
    int t;
    if((y-z.y)<0)
    {
    	cout<<"data error!"<<endl;
	}
	else if((y-z.y)==0)  //不跨年的情况 
	{
		t=daymod(z.y,z.m,m,z.d,d);
		return t;
	}
	else if((y-z.y)==1)  //年份相邻的情况 
	{
		t=backday(z.y,z.m,z.d)+frontday(y,m,d);
		return t;
	}
    else if((y-z.y)>1)  //年份不相邻的情况
	{
		int sum,i;
		sum=backday(z.y,z.m,z.d)+frontday(y,m,d);
		for(i=z.y+1;i<=y-1;i++)
		{
			sum+=yearmod(i);
		}
		return sum;
	}
}

date date::operator += (const int i)  //重载日期类+=运算 ——功能函数(乙) 
{
	date t;
	if(i<0)
	{
		cout<<"data error!"<<endl;
	}
	else
	{
		d+=i;
		while(d>monthmod(y,m))
		{
			d-=monthmod(y,m);
			m++;
			if(m==13)
			{
				y++;
				m=1;
			}
		}
		t.y=y;
		t.m=m;
		t.d=d;
		return t;
	}
	
}

date date::operator -= (const int i)  //重载日期类-=运算 ——功能函数(丙) 
{
	date t;
	if(i<0)
	{
		cout<<"data error!"<<endl;
	}
	else
	{
		d-=i;
		while(d<1)
		{
			m--;
			if(m==0)
			{
				y--;
				m=12;
			}
			d+=monthmod(y,m);
		}
		t.y=y;
		t.m=m;
		t.d=d;
		return t;
	}
}

int main() 
{
    using std::cin;
    using std::cout;
    using std::endl;
    date D1,D2;
    int year;
    int month;
    int day;
    cin>>year>>month>>day; //输入第一个日期 
    D1=date(year,month,day);
    cin>>year>>month>>day;  //输入第二个日期 
    D2=date(year,month,day);
    cout<<D2-D1<<endl; 
    cin>>day;  //输入要加减的天数
    D1+=day;
    D2-=day;
    cout<<D1.year()<<" "<<D1.month()<<" "<<D1.day()<<endl;
    cout<<D2.year()<<" "<<D2.month()<<" "<<D2.day()<<endl;
    return 0;
}
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
(1) 测试日期类成员函数,在主函数列出菜单选项,可以完成期的加减比较等测试功能。 (2) 完善程序功能,在期相加的菜单选项增加期加天数,结果为新期;期家份,结果为新期,要考虑闰情况。 (3) 完善程序功能,在相减的菜单选项增加期减天数,结果为新期;期减份,结果为新期,要考虑闰情况。 (4) 显示期时增加显示星期及英文形式的份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、期超过31天、时间超过24小时等情况)的识别显示功能。 (1) 仿照日期类编写时间CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时的时间格式。 (4) 编写时间和期的派生CDati,完成期与时间的联合设置、运算、比较等功能,要求该派生可以完成:期时间加天数或时间等于新的期时间,期时间减天数或等于新的期时间,两个期时间相减等于天数或时间等工作,在程序考虑闰等具体情况,并重载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、期超过31天、时间超过24小时等情况)的识别显示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jeron Zhou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值