Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Program do liczenia dni ubiegłych pomiędzy dwoma datami

DZIARA 29 Kwi 2010 22:51 1927 1
  • #1 29 Kwi 2010 22:51
    DZIARA
    Poziom 12  

    Witam serdecznie
    napisałem kod w C, który zlicza ilość dni pomiędzy dwoma datami wg kalendarza gregoriańskiego. Program działa na takiej zasadzie, że oblicza ilość dni jaka upłynęła od dnia narodzin Chrystusa (jakby dnia zero :) ) i w zależności od tego czy daty są n.e czy p.n.e dodaje do siebie lub odejmuje wyliczone wartości tych dwóch dat.
    Problem pojawił się, gdy pojawiają się daty przestępne. Jeżeli widzicie jakiś błąd w moim rozumowaniu prosiłbym o ukierunkowanie mnie do prawidłowego rozwiązania tego zadania.

    Code:
    main()
    
    {
          int d1,d2,m1,m2,r1,r2,y1,y2,i,j,k;
          int m[12]={0,31,59,90,120,151,181,212,243,273,304,334};
          scanf("%d %d %d %d %d %d",&r1,&m1,&d1,&r2,&m2,&d2);
         
          if(r1>0)
                  y1=r1-1;
          if(r1<0)
                  y1=(r1+1)*(-1);
          if(r2>0)
                  y2=r2-1;
          if(r2<0)
                  y2=(r2+1)*(-1);
          i=y1*365+m[m1-1]+d1+r1/4-r1/100+r1/400;
          j=y2*365+m[m2-1]+d2+r2/4-r2/100+r2/400;
         
          if(r1>1581 && m1>9 && d1>14)
                     i=i-10;
          if(r2>1581 && m2>9 && d2>14)
                     j=j-10;
                     
         
          if(r1==r2 && m1==m2 && d1==d2){
                    k=0;
                    printf("%d",k);
                    }
          if(r1<0 && r2<0 && ( r1<r2 || (r1==r2 && m1<m2) || (r1==r2 && m1==m2 && d1<d2))){
                        k=j-i;
                        printf("%d",k);
                        }
          if(r1<0 && r2<0 && ( r1>r2 || (r1==r2 && m1>m2) || (r1==r2 && m1==m2 && d1>d2))){
                        k=-(i-j);
                        printf("%d",k);
                        }
          if(r1<0 && r2>0){
                  k=i+j;
                  printf("%d",k);
                  }
         
          if(r1>0 && r2>0 && ( r1<r2 || (r1==r2 && m1<m2) || (r1==r2 && m1==m2 && d1<d2))){
                  k=j-i;
                  printf("%d",k);
                  }
         
          if(r1>0 && r2>0 && ( r1>r2 || (r1==r2 && m1>m2) || (r1==r2 && m1==m2 && d1>d2))){
                  k=-(i-j);
                  printf("%d",k);
                  }

          system("PAUSE");
          return(0);
    }

    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0 1
  • #2 01 Maj 2010 16:56
    serpent
    Poziom 11  

    Wg zaleceń Microsoftu operacje na datach powinny być wykonywane w następujący sposób:

    - datę wczytujesz do struktury SYSTEMTIME
    - konwertujesz strukturę SYSTEMTIME na FILETIME
    - konwertujesz strukturę FILETIME na ULARGE_INTEGER
    - używasz prostej arytmetyki na strukturze ULARGE_INTEGER
    - konwertujesz z powrotem na SYSTEMTIME

    0