#include
class date //声明DATE类
{
int year;//声明类成员year
int month;//声明类成员month
int day;//声明类成员day
public://以下为公有属性
date(int y,int m,int d) //构造函数,传入参数y,m,d
{
year=y;month=m;day=d; //分别赋值给类成员year,month,day
}
void disp()//显示年月日函数
{
cout << year << "." << month << "." << day << endl;//分别显示年月日,格式为年.月.日
}
friend int count_day(date &d,int); //声明友元函数 count_day 天数双向计算函数,方向由传入的int是否为0决定
friend int leap(int year);//声明友元函数leap 判断传入的year是否是闰年
friend int subs(date d1,date d2);//声明友元函数subs 计算两个传入的date对象d1和d2相差多少天
};
int count_day(date &d,int flag) //count_day实现
{
static int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}}; //每月天数数组,下标0为非闰年各月天数,下标1为闰年
int p,i,s;//声明变量p,i,s
if(leap(d.year))//如果传入对象d的year成员为闰年
p=1; //则取数组下标为1
else
p=0;//否则取0
if(flag)//如果传入的flag变量非0
{
s=d.day;//s等于当月的天数
for(i=1;i
}
else //否则,当flag=0
{
s=day_tab[p][d.month]-d.day; //s=该月天数减去d的日数(也就是日期d离本月结束还有多少天)
for (i=d.month+1;i<=12;i++) //循环,加上该月之后每月的天数
s+=day_tab[p][i-1];
}
return(s);//返回s
}
int leap(int year)//闰年判断函数,是闰年返回1,否则返回0
{
if(year%4==0 && year%100!=0 || year%400==0)
return 1;
else
return 0;
}
int subs(date d1,date d2) //计算d1和d2相距多少天
{
int days,day1,day2,y;
if(d1.year
days=count_day(d1,0); 计算d1距年底还有多少天
for(y=d1.year+1;y
days+=366L;
else
days+=365L;//否则加365天
days+=count_day(d2,1); //计算d2所在年到d2所在日有多少天
}
else if (d1.year==d2.year) //如果年份相等
{
day1=count_day(d1,1);//计算d1距年初有多少天
day2=count_day(d2,1);//计算d2距年初有多少天
days=day2-day1;//相减即为相隔天数
}
else//否则,即如果d1年份大于d2,反向计算,过程基本同第一个if
{
days=count_day(d2,0);
for(y=d2.year+1;y
days+=366L;
else
days+=365L;
days+=count_day(d1,1);
}
return days;
}
void main()//主函数
{
date d1(2000,1,1),d2(2005,10,1); //构造d1为2000年1月1日,d2为2005年10月1日
int ds1=subs(d1,d2),ds2=subs(d2,d1); //ds1为d1与d2相距多少天,ds2为d2与d1相距多少天,实际由于subs函数内部自动判断d1 d2哪个大,所以输出应该是一样的
cout << "日期d1:";d1.disp(); //显示日期d1
cout << "日期d2:";d2.disp();//显示日期d2
cout << "d1和d2相距" << ds1 << "天" << endl;//输出ds1
cout << "d2和d1相距" << ds2 << "天" << endl;//输出ds2
}