Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Basildon, Essex
    Messaggi
    34

    Calcolo giorni tra due dati in c++

    Vorrei creare un programma con dei vettori che mi calcoli i giorni che sono trascorsi tra due date...
    Però mi da dei risultati sbagliati
    Il codice è questo

    codice:
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    
    int main (){
           int mese[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
           int minizio;
           int mscad;
           int ginizio;
           int gscad;
           int giorni;
           int nfatture;
           int i;
           i=0;
           giorni=0;
    
    
          cout<<"Numero fatture"<<endl;
          cin>>nfatture;
    
    
                while (i<nfatture){
                    cout<<"inserire giorno inzio "<<endl;
                    cin>>ginizio;
                    cout<<"inserire mese inzio"<<endl;
                    cin>>minizio;
                    cout<<"inserire giorno scadanza "<<endl;
                    cin>>gscad;
                    cout<<"inserire mesescadenza"<<endl;
                    cin>>mscad;
    
    
                    for(int i = 0; i <= mscad; i++) {
                    giorni += mese [i];
    
    
                    }
                    cout<<"Giorni Trascorsi"<<giorni<<endl;
                    i++;
                }
                    system ("PAUSE");
                    return 0;
    
    
    }

    Abbiate pazienza è da poco che sto imparando questo linguaggio
    Ultima modifica di LeleFT; 03-04-2014 a 17:43 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima di tutto vedo che la variabile i la usi sia per il ciclo while che per il ciclo for.

    E poi hai considerato che, per i = 0, il valore di mese[i] vale 0 ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Basildon, Essex
    Messaggi
    34
    Quindi per il for dovrei darle un altro nome?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Magari non risolvi nel tuo caso specifico ma, in generale, non puoi usare la stessa variabile in due cicli inseriti uno nell'altro. Poi bisogna vedere se, oltre a questo, devi anche modificare altro ... come ti ho già scritto (ad esempio, non vedo l'azzeramento della variabile in cui metti il totale).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Conviene convertire le date in Julian Day:

    codice:
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    double JulianDay(int year, int month, int day)
    {
        double retValue;
        double Y, M, D;
        double A, B;
        
        D = day;
        
        if ( month <= 2 )
        {
            Y = year - 1;
            M = month + 12;
        }
        else
        {
            Y = year;
            M = month;
        }
        
        A = (int)(Y/100);
        B = 2 - A + (int)(A/4);
        
        retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;
        
        return retValue;
        
    }
    
    int main ()
    {
        int d1, m1, y1;
        int d2, m2, y2;
        
        double jd1, jd2;
        int diff;
        
        d1 = 5;
        m1 = 2;
        y1 = 1995;
        
        d2 = 31;
        m2 = 8;
        y2 = 2014;
        
        jd1 = JulianDay(y1, m1, d1);
        jd2 = JulianDay(y2, m2, d2);
        
        diff = (int)(jd2 - jd1);
        
        cout << endl;
        
        cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
        cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;
        
        cout << "Differenza in giorni: " << diff << endl << endl;
            
        return 0;
    }

    Output:
    [vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
    [vincenzo]$ ./jd

    Data 1: 5/2/1995
    Data 2: 31/8/2014
    Differenza in giorni: 7147

    L'algoritmo è preso da Astronomical Algorithms di Jean Meeus.

  6. #6
    I Giulian Day Number sono utili anche per ottenere una data aggiungendo un certo numero di giorni a una data di partenza:

    codice:
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <iomanip>
    
    using namespace std;
    
    double JulianDay(int year, int month, int day)
    {
        double retValue;
        double Y, M, D;
        double A, B;
        
        D = day;
        
        if ( month <= 2 )
        {
            Y = year - 1;
            M = month + 12;
        }
        else
        {
            Y = year;
            M = month;
        }
        
        A = (int)(Y/100);
        B = 2 - A + (int)(A/4);
        
        retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;
        
        return retValue;
        
    }
    
    void CalendarDate(double jd, int *year, int *month, int *day)
    {
        double num = jd + 0.5;
        int Z = (int)num;
        double F = num - Z;    
        double A, B, C, D, E;
        int alpha;
        
        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 );
        
        *day = B - D - (int)(30.6001 * E) + F;
        
        if ( E < 14 )
        {
            *month = E - 1;
        }
        else if ( E == 14 || E == 15 )
        {
            *month = E - 13;
        }
        
        if ( *month > 2 )
        {
            *year = C - 4716;
        }
        else if ( *month == 1 || *month == 2 )
        {
            *year = C - 4715;
        }
    }
    
    int DayOfTheWeek(double jd, char *strDay)
    {
        int num = (int)(jd + 1.5);
        int retValue = num % 7;
        
        switch ( retValue )
        {
            case 0:
                strcpy(strDay, "Domenica");
                break;
            case 1:
                strcpy(strDay, "Lunedì");
                break;
            case 2:
                strcpy(strDay, "Martedì");
                break;
            case 3:
                strcpy(strDay, "Mercoledì");
                break;
            case 4:
                strcpy(strDay, "Giovedì");
                break;
            case 5:
                strcpy(strDay, "Venerdi");
                break;
            case 6:
                strcpy(strDay, "Sabato");
                break;            
        }
        
        return retValue;    
    }
    
    int IsLeapYear(int year)
    {
        if ( year % 4 != 0 )
        {
            return 0;
        }
        else
        {
            if ( year % 100 != 0 )
                return 1;
            else if ( year % 400 != 0 )
                return 0;
            else
                return 1;            
        }
    }
    
    int DayOfTheYear(int year, int month, int day)
    {
        int N, K;
        
        K = IsLeapYear(year) ? 1 : 2;    
        
        N = (int)( (275 * month)/9 ) - K * (int)( (month + 9)/12 ) + day - 30;
        
        return N;
    }
    
    int main ()
    {
        int d1, m1, y1;
        int d2, m2, y2;
        
        int d3, m3, y3;    
        int d4, m4, y4;    
        
        double jd1, jd2, jd3, jd4;
        int diff;
        int addDays;
        int DayOfYear;
        
        char szDay[256];
        
        d1 = 5;
        m1 = 2;
        y1 = 1995;
        
        d2 = 31;
        m2 = 8;
        y2 = 2014;
        
        jd1 = JulianDay(y1, m1, d1);
        jd2 = JulianDay(y2, m2, d2);
        
        diff = (int)(jd2 - jd1);
        
        cout << endl;
        
        cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
        cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;    
        cout << "Differenza in giorni: " << diff << endl << endl;
        
        CalendarDate(jd1, &y3, &m3, &d3);
        cout << std::setprecision(21) << "jd -> " << jd1 << " = " << d3 << "/" << m3 << "/" << y3 << endl << endl;
        
        
        d3 = 30;
        m3 = 6;
        y3 = 1954;    
        
        jd3 = JulianDay(y3, m3, d3);
        DayOfTheWeek(jd3, szDay);
        
        cout << d3 << "/" << m3 << "/" << y3 << " -> " << szDay << endl << endl;
        
        
        addDays = 89;    
        jd4 = jd3 + addDays;
        CalendarDate(jd4, &y4, &m4, &d4);
        DayOfTheWeek(jd4, szDay);
        DayOfYear = DayOfTheYear(y4, m4, d4);
        
        cout << d3 << "/" << m3 << "/" << y3 <<    " + " << addDays << " giorni = " << d4 << "/" << m4 << "/" << y4 << " " << szDay << "; " << DayOfYear << "° giorno dell'anno." << endl << endl;        
            
        return 0;
    }

    Output
    [vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
    [vincenzo]$ ./jd

    Data 1: 5/2/1995
    Data 2: 31/8/2014
    Differenza in giorni: 7147

    jd -> 2449753.5 = 5/2/1995

    30/6/1954 -> Mercoledì

    30/6/1954 + 89 giorni = 27/9/1954 Lunedì; 270° giorno dell'anno.

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.