Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Zeldic
    Registrato dal
    Jan 2010
    Messaggi
    80

    [C] Giorno dopo.

    Ciao! Ho un problemino nel mio programma che deve restituire la data del giorno successiva a quella che inserisce l'utente. Il problema credo sia nella condizione if - else all'interno del ciclo while, riguardante il controllo dell'eventuale ultimo giorno del mese.
    E' scorretta, perché restituisce il giorno incrementato di 12, quanto vale M, il numero dei mesi. Se la sposto al di fuori del ciclo, il giorno si incrementerà di 2, come è ovvio che avvenga.

    Lo posto qui :


    codice:
    #include <stdio.h>              
    #include <stdlib.h>
    
    #define M 12
    
    
    main() { 
      int d;
      int month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      int m = 01;
      int y; 
      int f = 29;
      int i = 0;                   
      int first = 01;
      
      printf("Inserisci una data --> ");
      scanf("%2d%2d%4d", &d, &m, &y);
      printf("\n\n");
                                                     
      while(i < M) {
        if(month[i] == d)
          d = first;
            else                  
              d+= 1;          // L'errore è qui : somma sempre +12 a 'd'. Come faccio a spostare fuori dal ciclo questa istruzione??  :incupito:                 
              
      if( m == month[M] )                           
        y+= 1;
      
      if( (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 )  
        month[1] = f;
        
      i++;
    }  
      printf("Il giorno seguente e' il --> %2d %2d %4d.\n\n\n", d, m, y);
                              
    system("PAUSE");
    return 0;
    }
    Ed il resto del programma l'ho scritto correttamente?

  2. #2
    Secondo me ti stai complicando la vita inutilmente... puoi usare le (orribili) funzioni di <time.h> per risolvere il problema:
    codice:
    #include <time.h>
    
    // ...
    
    struct tm data={0};
    printf("Inserisci una data --> ");
    scanf("%2d%2d%4d", &data.tm_mday, &data.tm_mon, &data.tm_year);
    // Aggiusto per il formato richiesto da struct tm
    data.tm_mon--; // I mesi nella struttura tm sono con base 0 e non 1
    data.tm_year-=1900; // Gli anni hanno come 0 il 1900
    data.tm_isdst=-1; // Indovina da solo se c'è l'ora legale
    time_t timestamp=mktime(&data); // Converte la struttura con le componenti di data "spezzate" in un timestamp (di fatto è il numero di secondi passati dall'1/1/1970 alle 0.00 fino alla data di destinazione)
    timestamp+=24*60*60; // Passa al giorno successivo aggiungendo un adeguato numero di secondi
    data=*localtime(&timestamp); // Riconverte il timestamp così modificato in una struttura tm
    printf("Il giorno seguente e' il --> %2d %2d %4d.\n\n\n", data.tm_mday, data.tm_mon+1, data.tm_year+1900);
    Se invece lavori in C++ e hai a disposizione boost puoi usare la ottima Boost.DateTime, sicuramente migliore delle odiose funzioni di time.h.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Guarda qua:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define M 12
    
    
    main() {
      int d;
      int month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      int m = 01;
      int y;
      int f = 29;
      int i = 0;
      int first = 01;
    
      printf("Inserisci una data --> ");
      scanf("%2d%2d%4d", &d, &m, &y);
      printf("\n\n");
    
      while(i < M) {
        if(month[i] == d)
          d = first;
            else
                        // questo ciclo viene eseguito 12 volte
    
      if( m == month[M] )
        y+= 1;
    
      if( (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 )
        month[1] = f;
    
      i++;
    }
    d+=1;                          /* lo sommi a fine ciclo */
      printf("Il giorno seguente e' il --> %2d %2d %4d.\n\n\n", d, m, y);
    
    system("PAUSE");
    return 0;
    }
    Bastava metterlo alla fine,mettendolo dentro al ciclo d veniva incrementato 12 volte.
    Ma comunque non fai il controllo sulla data,ti da per buone date con valori oltre i limiti standard delle date (es.: il mese 1/12).
    Io ti consiglio di fare il controllo sul mese/giorno che viene inserito.
    Potresti utilizzare una struttura o un array,ecco un esempio:
    codice:
    int data[]={0,0,0},count=0;        // giorno,mese,anno;
    char stringa[10];
    ...
    while(data[0]<1||data[0]>31)
    {
        if(count)
            printf("Errore di digitazione,inserire un mese (1/12): ");
        else
            printf("Inserisci mese: ");
        gets(stringa);
        data[0]=atoi(stringa);
        count ++;
    }
    In questo caso ho usato atoi,ogni errore di digitazione viene riportato.

  4. #4
    Utente di HTML.it L'avatar di Zeldic
    Registrato dal
    Jan 2010
    Messaggi
    80


    Originariamente inviato da MItaly

    Secondo me ti stai complicando la vita inutilmente... puoi usare le (orribili) funzioni di <time.h> per risolvere il problema:

    Se invece lavori in C++ e hai a disposizione boost puoi usare la ottima Boost.DateTime, sicuramente migliore delle odiose funzioni di time.h.

    Infatti! Sto tardando a rispondervi, perché risulta tutto troppo complicato per me.. Avevo pensato anch'io alla libreria <time.h>, ma non so usare le sue funzioni, e poi non mi serve sapere l'ora o i secondi..

    La libreria Boost mi sembra ottima, ma anche lì non so come fare ad implementare il programma.

    Nè il file con estensione .tar.lz per la libreria GMP riesco ad aprire, né con WinZip, né con IZArc, né con 7-Zip.
    Comunque desisto. Sono una schiappa.



    Bastava metterlo alla fine,mettendolo dentro al ciclo d veniva incrementato 12 volte.

    Ma così il giorno si incrementa di 2!

    Che difficile però che è programmare..

  5. #5
    Originariamente inviato da Zeldic
    Infatti! Sto tardando a rispondervi, perché risulta tutto troppo complicato per me.. Avevo pensato anch'io alla libreria <time.h>, ma non so usare le sue funzioni, e poi non mi serve sapere l'ora o i secondi..
    Per quello che ti serve ti basta sapere che le funzioni di time.h lavorano o con la struttura tm (avendo così la data separata nelle sue componenti) o con time_t (un timestamp, ossia la data espressa come numero di secondi trascorsi dall'1/1/1970). Per passare da una rappresentazione all'altra usi mktime e localtime.
    Per la questione dell'ora, ti basta lasciarla a mezzanotte e considerare solamente le componenti che ti interessano.
    La libreria Boost mi sembra ottima, ma anche lì non so come fare ad implementare il programma.
    Con Dev-C++ non ti so aiutare per l'installazione di Boost...
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di Zeldic
    Registrato dal
    Jan 2010
    Messaggi
    80


    Originariamente inviato da MItaly


    Con Dev-C++ non ti so aiutare per l'installazione di Boost...

    E su quale compilatore dovrei lavorare per poter utilizzare la libreria Boost?

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.