题目:
设计一个日期类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 day,month,year;
public:
Date(int y,int m,int d):year(y),month(m),day(d){}
friend int count_day(Date &da,int flag);
friend int leap(int year);
friend int subs(Date &d1,Date &d2);
};
int leap(int year){
//int year = da.year;
if(year%4!=0)
return 0;
if(year%100!=0)
return 1;
if(year%400==0)
return 1;
return 0;
}
int count_day(Date &da,int flag){
int year = da.year;
int temp = leap( year),sum=0;
if(flag==1){
for (int i = 1; i < da.month;i++){
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 4 : case 6 : case 9 : case 11 :
sum += 30;
break;
}
}
sum += da.day;
}else{
for (int i = 12; i >=da.month;i--){
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 4 : case 6 : case 9 : case 11 :
sum += 30;
break;
}
}
sum -= da.day;
}
return sum;
}
int subs(Date &d1,Date &d2){
int sum = 0;
sum += count_day(d1, 0) + count_day(d2, 1);
if((d1.year-d2.year)==0){
int flag = leap(d1.year);
if(flag)
sum -= 366;
else
sum -= 365;
return sum;
}
if((d2.year-d1.year)>=2){
for (int i = d1.year + 1; i <=d2.year - 1;i++){
if(leap(i))
sum += 366;
else
sum += 365;
}
}
return sum;
}
int main() {
int d11, d22, m1, m2, y1, y2;
cin >> y1 >> m1 >> d11 >> y2 >> m2 >> d22;
if((y2-y1)<0||(m2-m1)<0||(d22-d11)<0){
cout << "time error!" << endl;
}else{
Date d1(y1, m1, d11),d2(y2,m2,d22);
cout << subs(d1, d2)<<endl;
}
//char kkk = getchar();
}