Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38

    [C++] Differenza in giorni tra due date.

    Salve a tutti,
    Premetto che ho iniziato a studiare il linguaggio C ++ da poco tempo.
    Sono ancora ai principi, ultimo argomento, istruzioni condizionali branch, questo giusto per fare un quadro della situazione.
    Ora mi è stato affidato un esercizio, devo calcolare la differenza in giorni tra due date, ma non riesco ad entrare nel ragionamento.
    Qualcuno può gentilmente indirizzarmi nel regionamento giusto ?
    Ho pensato di ridurre le date in giorni, tenendo presente gli anni bisestili, ma.. come faccio poi a sottrarre i giorni già trascorsi dalle date e poi calcolare quelli che mancono per arrivare alla seconda data ?
    Le cose sono due, o la soluzione è così semplice e io sono così stupido da non vederla oppure sono stupido.. e basta..! :berto:
    Grazie in anticipo per le risposte.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Non c'è nessuno disponibile ad aiutarmi ?

  3. #3
    Fai una funzione che calcola i giorni passati dall' anno 0.
    Ti calcoli i giorni trascorsi per le due date e poi li sottrai in valore assoulto.

    La somma dei giorni va fatta piu o meno così:

    giorni = (anni-1)* 365 + anni bisestili + giorni trascorsi nell' ultimo anno.

    comincia a scivere un pò di codice e postalo
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  4. #4
    Ho buttato giu 2 righe.....ora sta a te

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>

    int calcola_giorni(void);

    int main()
    {
      
    int numgiorni1numgiorni2differenza;
        
      
    numgiorni1 calcola_giorni();
      
    numgiorni2 calcola_giorni();
      
      
    differenza=abs(numgiorni1-numgiorni2);
      
      
    printf("\n\nDifferenza dei giorni= %d\n\n" differenza);
        
      
    system("PAUSE");    
      return 
    0;
    }


    int calcola_giorni(void)

      
    int numgiorni=0;
      
    int giornomeseanno;
      
      
    printf("Inserisci giorno: ");
      
    scanf("%d" , &giorno );
      
    /*controllare la validità del giorno */
      
    printf("Inserisci mese: ");
      
    scanf("%d" , &mese );
      
    /*controllare la validità del mese*/
      
    printf("Inserisci anno: ");
      
    scanf("%d" , &anno );
      
    printf("\n\n");
      
      
    /*controllare la validità dell anno*/
      
      /*controllare validità della data*/
        
      /*calcoolo num giorni*/
       
      
    return numgiorni;

    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    WOW... ti ringrazio per le risposte, proverò a studiarmi il codice che mi hai postato, purtroppo le funzioni sono un capitolo che ancora non ho affrontato, e quel poco che ho studiato sino ad ora è completamente diverso.. sfoglierò un pò il libro a questo punto, così intato cerco di capire che cosa hai fatto.
    Ad esempio, credo proprio di non conoscere il significato di & prima delle variabili giorno, mese anni! Proverò in ogni caso, grazie per avermi risposto.
    Anche le librerie che hai incluso sono diverse, sino ad ora ho solo usato:
    Codice PHP:
    #include <iostream>
    #include <cassert>
    #include <string>
    #include <cstring> 
    Queste sono le uniche che mi sono state presentate, ho detto di assere agli inizi, ma non pensavo così tanto, mi manca tanto vero ?? hehehe

  6. #6
    Beh si hai ragione... mi sa di aver toppato un pò,
    nel senso che il linguaggio era C++ io ho scritto in C.

    Ma sono piccole modifiche... sostituisci
    printf e scanf con cout e cin (dalla iostream)
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Ok... ci sono delle cose che però non mi sono chiare. Ad esempio, prendo una cosa più corta, calcolare i giorni trascorsi dal primo gennaio di questo anno sino ad ora, ma i mesi non sono tutti di 31 giorni, ad esempio se fossero stati tutti di 31 gg, credo, sarebbe bastato un ciclo for che addizionava 31 ad una variabile sino a raggiungere il mese in questione, un esempio:

    Codice PHP:
    #include <iostream>

    int result;    //giorni trascorsi
    int curDay;    //giorno corrente
    int curMonth;  //mese corrente


    int main() {
        
    curDay  5;      //ipotetico giorno
        
    curMonth 6      //ipotetico mese

        
    for(int i 0<= curMonthi++) {
            
    result += 31;
        }

        
    std::cout << "Sono trascorsi: " << result << '\n';
        return (
    0);

    Così sarebbe semplice!
    Ora lasciamo stare gli anni bisestili e il resto, come faccio a far capire al programma che, ad esempio, gennaio ha 31 gg, febbraio ne ha 28(dimenticando i bisestili x un attimo) etc..
    (Tra l'altro il "ciclo for" è un'argomento che non ho ancora studiato, lo conosco solo grazie a javascript e php)..
    Anche se volessi, prendere un bel 365 e sottrargli i giorni trascorsi, ma sono proprio quei gg che non mi stanno simpatici..
    Anyway.. è proprio questo che non riesco a capire.

    Spero di non aver scritto cose ridicole, altrmineti, ridiamo per non piangere.
    Grazie ancora!

  8. #8
    Il programma non lo può capire da solo.
    Potresti dichiarare un array di dimenione 12 i cui elementi sono i giorni di ogni mese.
    Quindi senza considerare gli anni bisestili..

    int mesi[12]= { 31 , 28 , 31 , 30 ... e così via

    oppure usare questa formula
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Ci sono riuscito, mille grazie per gli spunti che mi hanno aiutato a ragionare..
    In effetti non ho seguito molto il tuo codice sono un tipo abbastanza testardo e se non è farina del mio sacco non mi quadra! , cmq il merito è tuo, mi hai indirizzato sul ragionamentoi giusto! GRAZIE!
    Posto il codice, sarei veramente felice se qualcuno me lo criticasse, veramente!
    Codice PHP:
    #include <iostream>
    #include <cassert>

    int firstDay;   //Giorno della prima data
    int firstMonth//Mese della prima data
    int firstYear;  //Anno prima data
    int secDay;     //Giorno seconda data
    int secMonth;   //mese seconda data
    int secYear;    //anno seconda data

    int month[] = { 0312831303130313130313031 }; /* mesi dell'anno
                                                                          * in giorni
                                                                          */
    int passedDayF//giorni trascorsi nella prima data
    int passedDayS//giorni trascorsi seconda data
    int remainingF//giorni rimanenti nella prima data
    int remainingS//giorni rimanenti seconda data
    int totDays;    //risultato differenza fra le due date
    int passedYear//anni trascorsi dalla prima alla seconda data
    int bisYear(0); //quanti anni bisestili ?


    int main(){
        
    std::cout << "Inserisci primo giorno: ";
        
    std::cin >> firstDay;
        
        
    assert(firstDay 0); /*<------------ NOTA */
        
    assert(firstDay <= 31); /*<---------- NOTA */

        
    std::cout << "Inserisci primo mese: ";
        
    std::cin >> firstMonth;
        
        
    assert(firstMonth 0); /*<---------- NOTA */
        
    assert(firstMonth <= 12); /*<-------- NOTA */

        
    std::cout << "Inserisci primo anno: ";
        
    std::cin >> firstYear;

        
    assert(firstYear 0); /*<----------- NOTA */

        
    std::cout << "Inserisci secondo giorno: ";
        
    std::cin >> secDay;

        
    assert(secDay 0); /*<-------------- NOTA */
        
    assert(secDay <= 31); /*<------------ NOTA */

        
    std::cout << "Inserisci secondo mese: ";
        
    std::cin >> secMonth;

        
    assert(secMonth 0); /*<------------ NOTA */
        
    assert(secMonth <= 12); /*<---------- NOTA */

        
    std::cout << "Inserisci secondo anno: ";
        
    std::cin >> secYear;

        
    assert(secYear 0);  /*<------------ NOTA */

        
    assert(firstYear <= secYear); /*<---- NOTA */

        /*>>>>>> CONTROLLO ANNI BISESTILI <<<<<<<*/
        
    std::cout << "Considerando che: \n";

        for (
    int i=firstYeari<=secYeari++){
            if (((
    4) == && (100) != 0) || (400) == 0) {
                
    std::cout << "Il " << << " e' un anno bisestile!\n";
                
    bisYear += 1;
            } else {
                
    std::cout << "Il " << << " non e' un anno bisestile!\n";
            }
        }

        
        
    /*>>>>>> GG TRASCORSI NELLA PRIMA DATA <<<<<<<<*/
        
    for (int i=0firstMonthi++){
            
    passedDayF += month[i];
        }

        
    passedDayF += firstDay;

        
    std::cout << "\nSono passati: " << passedDayF << " gg nella prima data\n";

        
    /*>>>>>> GG TRASCORSI SECONDA DATA <<<<<<<*/
        
    for (int i=0i<secMonthi++) {
            
    passedDayS += month[i];
        }

        
    passedDayS += secDay;

        
    std::cout << "Sono passati: " << passedDayS << " gg nella seconda data!\n\n";

        
    /*>>>>>>> CALCOLO GIORNI RESTANTI X COMPLETARE L'ANNO <<<<<<<<*/
        
    remainingF 365 passedDayF;  //prima data
        
    remainingS 365 passedDayS;  //seconda data

        
    std::cout << "Rimangono : " << remainingF << " gg per completare l'anno (prima data)\n";
        
    std::cout << "Rimangono : " << remainingS << " gg per completare l'anno (seconda data)\n\n";

        
    passedYear secYear firstYear;

        
    std::cout << "Tra le due date sono passati: " << passedYear << " anni!\n\n";

        
    /* ---> Secondo gli anni trascorsi adatto il risultato <---- */
        
    if (passedYear == 0)
            
    totDays = ((365 bisYear) - passedDayF) - remainingS;

        if (
    passedYear == 1)
            
    totDays = ((730 bisYear) - passedDayF) - remainingS;

        if (
    passedYear >= 2)
            
    totDays = ((((passedYear+1) * 365) + bisYear) - passedDayF) - remainingS;

        
    std::cout << "La differenza in gg tra le date e' di: " << totDays << " gg\n\n";
        
        return (
    0);


    Grazie ancora siete mitici!

  10. #10
    La tua soluzione è ottima, anche se C e C++ mettono già a disposizione strumenti per lavorare con le date nell'header time.h (ctime in C++):
    codice:
    #include <iostream>
    #include <ctime>
    using namespace std;
    void getdate(tm * timestruct);
    int main()
    {
        tm data1={0}, data2={0};
        time_t td1, td2;
        int diff;
        cout<<"Calcolo differenza date\n";
        cout<<"Inserire la prima data:\n";
        getdate(&data1);
        if((td1 = mktime(&data1)) == -1)
        {
            cerr<<"Data non valida\n";
            return 1;
        }
        cout<<"Inserire la seconda data:\n";
        getdate(&data2);
        if((td2 = mktime(&data2)) == -1)
        {
            cerr<<"Data non valida\n";
            return 1;
        }    
        diff = abs(td1 - td2)/86400;
        cout<<"Differenza: "<<diff<<" giorni.\n";
        return 0;
    }
    void getdate(tm * timestruct)
    {
        cout<<"Anno: ";
        cin>>timestruct->tm_year;
        timestruct->tm_year-=1900;
        cout<<"Mese: ";
        cin>>timestruct->tm_mon;
        cout<<"Giorno: ";
        cin>>timestruct->tm_mday;
        timestruct->tm_isdst=-1;
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.