logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Program w C nie oblicza poprawnie różnicy dni między datami - błędy?

Kanan 22 Maj 2004 10:23 3576 4
REKLAMA
  • #1 653752
    Kanan
    Poziom 10  
    Posty: 55
    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 sie, ze powinno dzialac, niestety liczba wyswietlana po wpisaniu dwoch dat bynajmniej nie jest ta oczekiwana.

    Prosze o pomoc w miare mozliwosci!

    Pozdrawiam

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


    Zamykam. - arnoldziq
  • REKLAMA
  • #2 653782
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Hm.. niemam aktualnie kompilatora na dysku.. ale z tego co mi sie wydaje to to, że jest np data1 = 31 styczeń a data2= 1 luty... ty dodajesz 1 miesiąc i jeden dzień i jusz masz makabre... hyba że źle zinterpretowałem kod...
    Radze Tobie żebyś zrobił funkcje która liczą ile dni upłyneło od narodzin Chrystusa(ew. inny punkt zero) do podane daty.. wtedy wystarczy odjąć wyniki i jest ilość dni..
  • REKLAMA
  • #3 653824
    Kanan
    Poziom 10  
    Posty: 55
    Ale czy mozna to zrobic w jakis prosty sposob, czy tez wymagana jest rowniez dosc pracochlonna ochrona wyjatkow. Prosze o pomoc! Bo zupelnie nie wiem, jak poprawic te bledy? Na czym generalnie polega moj blad??
  • REKLAMA
  • #4 654108
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A nie lepiej przeliczyć to na czas systemowy (w sekundach) i odjąć od siebie?
  • #5 656805
    krzychoo_soft
    Poziom 17  
    Posty: 233
    Pomógł: 16
    Ocena: 13
    Myślę że kolega elektryk ma racje, to najprostrzy i chyba najbardziej efektowny sposób w tym przypadku. Do manipulacji na wyniku wystarczy tylko iloczyn i iloraz. I ewentualnie kilka warunków jako 'obsługa wyjątków'.

    Pozrdawiam,
REKLAMA