7-2 编写一个友元函数,求两个日期之间相差的天数。 (10分)

7-2 编写一个友元函数,求两个日期之间相差的天数。 (10分)
设计一个日期类Date,包括日期的年份、月份和日号,编写一个友元函数,求两个日期之间相差的天数。该类中设计有3个友元函数;count_day()函数,它有两个参数,第2个参数是一个标志,当其值等于1 时,计算一年的开始到某日期的天数;否则计算某日期到年尾的天数。leap()函数用于判断指定的年份是否为闰年。subs()函数用于计算两个日期之间的天数。 当时间输入不正确时,输出“time error!”
输入样例:
在这里给出一组输入。例如:

2000 1 1
2002 10 1
输出样例:
在这里给出相应的输出。例如:

1004

在这里插入代码片
#include<iostream>
using namespace std;
class date
{
	int y,m,d;
	public:
	date(int y1,int m1,int d1)
	{
		y=y1;m=m1;d=d1;
	}
	friend int leap(int h);
	friend int countday(date &a,int x);
	friend int subs(date &a,date &b);
};//
int countday(date &a,int x)//可以根据需求选择统计向前的天数还是向后的天数,为了方便其他函数的使用
{
	int year=a.y;
	int leap(int);//因为是友元函数,函数内调用需要说明
	int temp=leap(year),sum=0;
	for(int i=1;i<a.m;i++)//用switch加if语句告别以前的叠罗汉式代码哈哈哈哈哈哈哈
	{
		if(i==2)
		{
			if(temp) sum+=29;
			else sum+=28;
			continue;
		}
		switch(i)
		{
			case 1:case 3:case 5: case 7: case 8: case 10:case 12:
				sum+=31;break;
			case 6: case 4: case 9: case 11:
				sum+=30;break;
	    }
	}
	sum+=a.d;
	if(x==1) return sum;
	else
	{
		if(temp==1) return 366-sum;
		else if(temp!=1) return 365-sum;
	}
} 
int leap(int h)//判断是否为闰年
{
	if(h%4==0&&h%100==0&&h%400==0) return 1;
	else if(h%4==0&&h%100==0&&h%400!=0) return 0;
	else if(h%4==0&&h%100!=0) return 1;
	else if(h%4!=0) return 0;
}
int subs(date &d1,date &d2)//两个时间的相减,参数都是类对象
{
	int sum=0;
	sum+=countday(d1,0)+countday(d2,1);//第一年的后+第二年的前
	if((d1.y-d2.y)==0)//年份如果相同
	{
		int flag=leap(d1.y);
		if(flag) sum-=366;//正好多了366或365
		else sum-=365;
		return sum;
	} 
	if((d2.y-d1.y)>=2)//年份大于等于两年
	{
		for(int i=d1.y+1;i<=d2.y-1;i++)
		{
			if(leap(i)) sum+=366;//之间要加上间隔年份的天数
			else sum+=365;
		}
	}
	return sum;
	//年份差一年,就直接输出,不用再加什么了
}
int main()
{
	int a,b,c,a1,b1,c1;
	cin>>a>>b>>c>>a1>>b1>>c1;
	if((a1-a)<0||(b1-b)<0||(c1-c)<0) cout<<"time error!";
	else
	{
		date d1(a,b,c);date d2(a1,b1,c1);
		cout<<subs(d1,d2)<<endl;//直接调用subs函数就行了
	}
	return 0;
}
//因为subs函数同时要输入变量date &d1,date &d2,所以申请为友元函数,其实也可以申请为成员函数,调用时d1.subs(date&d2)这样
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值