[ C] roznica pomiedzy dwoma dniami

0

Jaki jest naprostszy sposob na obliczenie wartosci pomiedzy dwoma datami? Czy trzeba tworzyc rozbudowana baze obslugi wyjatkow (zliczanie lat przystepnych, miesiecy 30 i 31 dniowych), czy tez moze istnieje jakis gotowy algorytmy, ktory mozna od zastosowac mniej meczac sie??

Napisalem taki oto programi, ktory w zalozeniu ma obliczac roznice pomiedzy dwoma datami. Niestety nie dziala, nie wiem czy jest to tylko blad konwersji, czy po prostu zapomnialem o obsludze jakiegos wyjatku, tylko wlasnie jakiego? Wydaje mi się, ze powinno dzialac, niestety liczba wyswietlana po wpisaniu dwoch dat bynajmniej nie jest ta oczekiwana.

Prosze o pomoc w miare mozliwosci!

Pozdrawiam

Kod:

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <time.h> 
#include <dos.h> 

char przystepny (int); 
int dni_miesiaca (int,int); 
void roznica_dni(void); 
int liczba_dni (int); 
long licznik(int,int,int,int); 

void main () 

{ 
roznica_dni(); 
} 
/* Zlicza ile dni ma dany miesiac */ 
int dni_miesiaca (int year, int month) 
{ 
  int wart; 
  switch(month) 
  { 
    case 4 : wart=30; break; 
    case 6 : wart=30; break; 
    case 9 : wart=30; break; 
    case 11 : wart=30; break; 
    case 2 : if (przystepny(year)=='t') wart=29; 
                else wart=28; break; 
    default : wart=31; break; 
  } 
  return wart; 
} 
//sprawdza czy rok jest przystepny 
div_t reszta, reszta2; 
char przystepny (int year) 
{  char wart; 
   reszta2=div(year,100); 
   if ((reszta2.rem!=0) || (year==2000)) wart='t'; 
     else wart='n'; 
   reszta=div(year,4); 
   if ((reszta.rem==0) && (wart=='t')) return 't'; 
     else return 'n'; 
} 
//sumuje ile dni minelo w miesiach danego roku 
int liczba_dni (int mie) 
{ 
  int m_help,i; 
      m_help=0; 
       for (i=0; i<mie; i++) 
      { 
       switch (i) 
         { 
           case 4  : m_help+=30; break; 
           case 6  : m_help+=30; break; 
           case 9  : m_help+=30; break; 
           case 11 : m_help+=30; break; 
           case 2  : m_help+=28; break; 
           default : m_help+=31; break; 
         }; 
      }; 
      return m_help; 
} 
// liczy lata przystepne 
long licznik (int year1, int year2, int mie1, int mie2) 
{ 
 long ile; 
 int pomoc1; 
 char pomoc2; 
 ile=0; 
 if (year1>=year2) 
         { 
            pomoc2= przystepny(year1); 
            if ((pomoc2=='t') && (mie1>=3)) ile++; 
            pomoc2=przystepny(year2); 
            if ((pomoc2=='t') && (mie2>=3)) ile--; 
            for (pomoc1=year2; pomoc1<year1; pomoc1++) 
           { 
               pomoc2=przystepny(pomoc1); 
               if (pomoc2=='t') ile++; 
           }; 
           } 
 else ile=licznik(year2,year1,mie2,mie1); 
 return ile; 
} 
// oblicza roznice dni 
void roznica_dni (void) 
{ 
 int rok1, dzien1, miesiac1, rok2, dzien2, miesiac2, help1, help2; 
 long wynik, temp_rok, temp_mie, temp_day; 

   clrscr(); 

   textcolor (WHITE); 
   gotoxy(2,1); 
   cprintf ("Podaj daty dla ktorych chcesz wyliczyc roznice"); 
   gotoxy(5,3); 
   cprintf ("Podaj 1 rok  (0-2500)  > "); 
   gotoxy(5,4); 
   cprintf ("Podaj 1 miesiac (1-12) > "); 
   gotoxy(5,5); 
   cprintf ("Podaj 1 dzien  (1-31)  > "); 
   gotoxy(5,7); 
   cprintf ("Podaj 2 rok  (0-2500)  > "); 
   gotoxy(5,8); 
   cprintf ("Podaj 2 miesiac (1-12) > "); 
   gotoxy(5,9); 
   cprintf ("Podaj 2 dzien  (1-31)  > "); 

   gotoxy(30,3); 
      scanf("%d",rok1); 
   gotoxy(30,4); 
      scanf("%d",miesiac1); 
   gotoxy(30,5); 
      scanf("%d",dzien1); 

   gotoxy(30,7); 
      scanf("%d",rok2); 
   gotoxy(30,8); 
      scanf("%d",miesiac2); 
   gotoxy(30,9); 
      scanf("%d",dzien2); 


 if ((rok1<rok2) || ((rok1==rok2) && (miesiac1<miesiac2)) 
      || ((rok1==rok2) && (miesiac1==miesiac2) && (dzien1<dzien2))) 
 { 
   temp_rok=rok1; 
   temp_mie=miesiac1; 
   temp_day=dzien1; 
   rok1=rok2; 
   miesiac1=miesiac2; 
   dzien1=dzien2; 
   rok2=temp_rok; 
   miesiac2=temp_mie; 
   dzien2=temp_day; 
 }; 

   help1=(liczba_dni(miesiac1)); 
   help2=(liczba_dni(miesiac2)); 
   gotoxy(1,15); 
 textcolor(WHITE); 
 cprintf("%d",help1-help2); 

 gotoxy(1,16); 
printf("Roznica:"); 
 //gotoxy(3,1); 
 textcolor (WHITE); 

 wynik=((rok1-rok2)*365)+(help1-help2)+(dzien1-dzien2)+licznik(rok1,rok2,miesiac1,miesiac2); 
 gotoxy(1,15); 
 cprintf(" %d dni",wynik); 
 getch(); 
} 
0

Algorytm obliczania Dni Julianskich (Julian Day); [hurra]

1 użytkowników online, w tym zalogowanych: 0, gości: 1