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();
}