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)这样