DATE类

#include<iostream>
using namespace std;
int mdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份所含日期数组 
class Date//日期类 
{
	public:
	int year,month,day;
	Date(int x,int y,int z) {year=x,month=y,day=z;}//构造日期 
	Date() {}//构造空 
	~Date(){}//释放 
	int days(Date v);//求这一年的第几天 
	
	int operator-(Date v);//求两个日期的间隔天数 
	bool operator>(Date v);//判断日期是否更早 
	bool operator<(Date v);//判断日期是否更晚 
	void operator/=(Date &v);//交换两个日期  
	void operator=(Date v);//日期赋值 
	
	void print();//输出日期 
};
bool leapyear(int x)//判断闰年的函数 
{
	return (x%100==0&&x%400==0||x%100!=0&&x%4==0);//判断闰年的方法 
}
bool Date::operator>(Date v)//判断日期更早的运算符 
{
	return (year<v.year||year==v.year&&month<v.month||year==v.year&&month==v.month&&day<v.day);//这个日期更早的三种情况 
}
bool Date::operator<(Date v)//判断日期更晚的运算符 
{
	return (year>v.year||year==v.year&&month>v.month||year==v.year&&month==v.month&&day>v.day);//这个日期更晚的三种情况 
}
void Date::operator/=(Date &v)//交换日期的运算符 
{
	swap(year,v.year);//交换年 
	swap(month,v.month);//交换月 
	swap(day,v.day);//交换日 
}
int Date::days(Date u)//求日期是本年的第多少天 
{
	int s=u.day;//加上最后一个月的日期 
	for(int i=1;i<u.month;i++)//累加前几个月的日子 
	{
		s+=mdays[i];
		if(i==2)//判断是否闰年,二月28/29天 
		{
			if(leapyear(u.year)) s++;
		}
	}
	return s;
}
void Date::operator=(Date v)//日期赋值 
{
	(*this).year=v.year;
	(*this).month=v.month;
	(*this).day=v.day;
}
int Date::operator-(Date v)//求算间隔 
{
	Date u=(*this);
	if((*this)<v) u/=v; //保证日期更早的在前,为u,日期较小的在后,为v 
	//u.print();
	//v.print();
	int day1=days(u),day2=days(v);//计算公式为u.year~z.year-1完整年度所包含天数-u在本年的第多少天+v在本年的第多少天+1 
	//cout<<day1<<' '<<day2<<endl;
	for(int i=u.year;i<v.year;i++)//计算整年天数 
	{
		if(leapyear(i)) day2+=366;
		else day2+=365;
		//cout<<i<<' '<<day2<<endl;
	}
	day2-=day1;//减掉u在本年的第多少天 
	return day2+1;//+1 
}
void Date::print()//输出日期 
{
	printf("%d.%d.%d\n",year,month,day);//格式为XX.X.X 
}
int main()
{
	Date AO(2000,7,1);//AO的生日为2000.7.1 
	Date XIANG(1983,7,21);//XIANG的生日为1983.7.21 
	AO/=XIANG;//交换AO和XIANG的生日 
	AO.print();//输出AO的生日 
	XIANG.print();//输出XIANG的生日 
	printf("%d",AO-XIANG);//输出间隔多少天 
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值