1. 程式人生 > >C/C++ 結構體(兩個日期間的天數)

C/C++ 結構體(兩個日期間的天數)

題目描述

求兩個日期d1,d2之間相差的天數d2-d1。

輸入

 輸入資料有若干組。每組資料一行,有六個整數,表示兩個日期d1,d2,格式為:年月日。

輸出

 對於每一組資料,輸出兩個日期d1,d2之間相差的天數, 格式參照樣例輸出。

樣例輸入

2000 1 1 2002 10 1
2010 1 10 2010 3 20

樣例輸出

2002/10/1-2000/1/1=1004
2010/3/20-2010/1/10=69
 #include <stdio.h>
 int daysOfMonth(int y,int m);
 //計算任意兩個日期之間的天數
 
 //判斷輸入有效
 int valiDate(int y,int m,int d){
    if(y>3000||y<1900){
       printf("error year!\n");
    return 1;
    }
  if(m>12||m<1){
        printf("error month!\n");
    return 1;
    }
    if(d>daysOfMonth(y,m)||d<1){
        printf("error day!\n");
    return 1;
    }
    return 0;
 }
 
 //一個整月的天數
 int daysOfMonth(int y,int m){
    if(m==2){
       if(y%4==0&&y%100!=0||y%400==0){
        return 29;
    }else{
        return 28;
    }
    }else if(m==4||m==6||m==9||m==11){
            return 30;
   }else{
            return 31;
    }
 }
 
 //輸入年份已經過的天數
 int daysBefore(int y,int m,int d){
    int i,result=0;
    for(i=1;i<=12;i++){
        if(i==m){
       result += d;
        return result;
    }else{
        result += daysOfMonth(y,i);
    }
    }
 }
 
 //計算每年天數
 int daysOfYear(int y){
    if(y%4==0&&y%400!=0||y%400==0){
        return 366;
    }else return 365;
 }
 //主函式
 int main(){
    int y1,m1,d1,y2,m2,d2;
	while(scanf("%d%d%d",&y1,&m1,&d1)!=EOF)
	{
    
   while(valiDate(y1,m1,d1)){
        scanf("%d%d%d",&y1,&m1,&d1);
    }
    scanf("%d%d%d",&y2,&m2,&d2);
    while(valiDate(y2,m2,d2)){
        scanf("%d%d%d",&y2,&m2,&d2);

    }
   int i,result=0;
    for(i=y1;i<y2;i++){
       result += daysOfYear(i);
   }
    result = result - daysBefore(y1,m1,d1) + daysBefore(y2,m2,d2);
    printf("%d/%d/%d-%d/%d/%d=%d\n",y2,m2,d2,y1,m1,d1,result);
	}
   return 0;
}