Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2015
    residenza
    Italia
    Messaggi
    23

    Differenza tra due date!

    Salve a tutti , sono alle prese con un programma che richiede di scrivere una funzione in grado di contare il numero di giorni intercorsi tra due date. Ho abbozzato qualcosa creando una struttura ed effettuando con tre funzione le apposite differenze. Purtroppo nel momento in cui queste funzioni dovrebbero stampare il risultato finale danno un risultato errato. Qui sotto ho postato le tre funzioni con l'apposita struttura. Ditemi cosa ne pensate ed eventuali errori !

    codice:
    typedef struct struttura{
     int g, m, a;
     }data;
    
    
    
    int anno(data *m, data *k){
     int diff= m->a - k->a;
     int i;
     int j=diff*365;
     if (diff=!0){
      for(i=m->a+1; i<=k->a; i++){
       if (((i%4)==0 && (i%100)!=0) || (i%400)==0) {
        j++;
        }
       }
      }
     else{
        diff= k->a - m->a;
        for(i=k->a+1; i<=m->a; i++){
         if (((i%4)==0 && (i%100)!=0) || (i%400)==0) {
          j++;
         }
        }
       }
     return j;
    }
    
    
    int mese(data *m, data *k){
     int r=m->m - k->m;
     int s;
      if(r!=0){
        s=r*31;
     }
     else{
        r=k->m - m->m;
        s=r*30;
     }
     return s;
    }
    
    
    int giorno(data *m, data *k){
     int t=m->g - k->g;
     int v=k->g - m->g;
      if(t!=0){
        return t;
     }
     else{
        return v;
     }
    }

  2. #2
    Conviene trasformare le date in julian day. La differenza in giorni la si ottiene sottraendo i due valori:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct struttura
    {
        int g, m, a;
    }data;
    
    
    int IsJulianDate(int year, int month, int day)
    {
        if ( year > 1582 )
            return 0;
            
        if ( month > 10 )
            return 0;
            
        if ( day > 4 )
            return 0;
            
        return 1;
    }
    
    double CalendarDateToJulianDay(const data *dt)
    {
        double Y, M, D;
        double A, B;
            
        B = 0;
        
        D = dt->g;    
            
        if ( dt->m <= 2 )
        {
            Y = dt->a - 1;
            M = dt->m + 12;
        }
        else
        {
            Y = dt->a;
            M = dt->m;
        }
        
        if ( !IsJulianDate(dt->a, dt->m, dt->g) )
        {
            A = (int)(Y/100);
            B = 2 - A + (int)(A/4);
        }
        
        return ( (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5 );    
    }
    
    void JulianDayToCalendarDate(double jd, data *dt)
    {
        double num = jd + 0.5;
        int Z = (int)num;
        double F = num - Z;    
        double A, B, C, D, E;
        int alpha;
        
        double decimalDays;
            
        if ( Z < 2299161 )
        {
            A = Z;    
        }
        else
        {
            alpha = (int)( (Z - 1867216.25) / 36524.25 );
            A = Z + 1 + alpha - (int)(alpha / 4);
        }
        
        B = A + 1524;
        C = (int)( (B - 122.1) / 365.25 );
        D = (int)( 365.25 * C );
        E = (int)( (B - D) / 30.6001 );
        
        decimalDays = B - D - (int)(30.6001 * E) + F;
            
        dt->g = (int)decimalDays;
                        
        if ( E < 14 )
        {
            dt->m = E - 1;
        }
        else if ( E == 14 || E == 15 )
        {
            dt->m = E - 13;
        }
        
        if ( dt->m > 2 )
        {
            dt->a = C - 4716;
        }
        else if ( dt->m == 1 || dt->m == 2 )
        {
            dt->a = C - 4715;
        }
    }
    
    /*
    gcc -Wall -Wextra -pedantic -O2 main.c -o prova
    */
    
    int main()
    {
        data dt1;
        data dt2;    
        data dt3;
        
        double jd1;    
        double jd2;    
        double jd3;    
        
        int giorni;    
        
        dt1.g = 2;
        dt1.m = 6;
        dt1.a = 1900;
    
        dt2.g = 5;
        dt2.m = 1;
        dt2.a = 1990;
        
        jd1 = CalendarDateToJulianDay(&dt1);
        
        jd2 = CalendarDateToJulianDay(&dt2);
        
        giorni = (int)(jd2 - jd1);
    
        printf("Data 1: %d/%d/%d\n", dt1.g, dt1.m, dt1.a);
        printf("Data 2: %d/%d/%d\n", dt2.g, dt2.m, dt2.a);
        printf("\ndifferenza in giorni: %d\n", giorni);
        
        giorni = 89;
        jd3 = jd2 + giorni;
        
        JulianDayToCalendarDate(jd3, &dt3);
        
        printf("\n%d/%d/%d + %d giorni = %d/%d/%d\n", dt2.g, dt2.m, dt2.a, giorni, dt3.g, dt3.m, dt3.a);
        
        return EXIT_SUCCESS;
    }
    Output:
    codice:
    Data 1: 2/6/1900
    Data 2: 5/1/1990
    
    differenza in giorni: 32724
    
    5/1/1990 + 89 giorni = 4/4/1990

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2015
    residenza
    Italia
    Messaggi
    23
    Adesso lo provo subito, grazie

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.