Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [C] Generatore di Date

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23

    Generatore di Date

    Salve, dopo l'esercizio sugli allenamenti, che funziona alla grande, mi necessita di scrivere un programma che generi delle date di nascita..
    Vi posto il programma "base", senza per ora dirvi qual'è l'implementazione che vorrei fare, d'altronde, se le fondamenta sono guaste, e' inutile andare avanti.





    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
    unsigned short int g,m,a;
    char s;
    
    
    
    printf("Inserisci separatore date:\n");
    scanf("%c",&s);
    
    for(a=1900;a<=2020;a++)
    {
         for(g=1;g<=31;g++)
         {
             for(m=1;m<=12;m++)
             {
                    printf("%.2d%c%.2d%c%d",g,s,m,s,a);
                    printf("\n");
             }
    
         }
    
    }
    
    
    
    
    
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh ... così potrebbero saltare fuori date senza senso, come 31/2 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    L'importante e' che non sia qualcosa di senza senso del tipo 2/31..
    Non credo (per ora) che valga la pena di mettere delle restrizioni per quanto riguarda i mesi non di 31 giorni..
    Per il resto, potrebbe andare?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    partiamo dall'anno, se è divisibile per 4 è bisestile, almeno che non sia un anno secolare diverso da 400:
    codice:
    ((anno % a == 0) && ((anno % 100 != 0) || (anno % 400 == 0)))
    Ora in base al mese selezioni il numero di giorni con uno switch...
    codice:
    int n_giorni;
    switch(mese) {
     case 1:
     case 3:
     case ...:
      n_giorni = 31;
      break;
     case 2:
      n_giorni = (bisestile) ? 29 : 28;
      break;
     case 4:
     case ...:
      n_giorni = 30;
      break;
    }
    Ed il gioco è fatto.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    Benissimo.
    Ciò che volevo aggiungere era il selettore dell'anno, dunque stavo pensando a qualcosa del tipo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
     unsigned short int g,m,a;
     int i,f;
     char s;
    
    
    printf("Inserisci anno di inizio:\n");
    scanf("%d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%d",&f);
    
     printf("Inserisci separatore date:\n");
     scanf("%c",&s);
    
    
     for(a=i;a<=f;a++)
     {
         for(g=1;g<=31;g++)
         {
             for(m=1;m<=12;m++)
             {
                    printf("%.2d%c%.2d%c%d",g,s,m,s,a);
                    printf("\n");
             }
    
         }
    
     }
    
    
    
    
    
        return 0;
    }
    Ma, nonostante la compilazione vada a buonfine, il programma non si comporta come dovrebbe.
    Salta infatti la terza domanda, il selettore del carattere di separazione, e l'output viene di questo tipo:
    codice:
    Inserisci anno di inizio:
    Inserisci anno di fine:
    Inserisci separatore date:
    01
    01
    2001
    01
    02
    2001
    01
    03
    2001
    01
    04
    2001
    01
    05
    2001
    01
    06
    2001
    01
    07
    2001

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da eltonio
    L'importante e' che non sia qualcosa di senza senso del tipo 2/31..
    Senza senso è anche 31/2 ... non capisco perché dici che "non vale la pena".

    Per l'input, devi svuotare il buffer di tastiera dopo la scanf, come mille volte discusso in questo forum.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    Immagino come sia seccante dover essere ripetitivi e aver a che fare coi soliti caproni..
    Dando una veloce occhiata, dovrei aggiungere
    fflush(stdin);
    dopo la richiesta del separatore?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da eltonio
    Immagino come sia seccante dover essere ripetitivi e aver a che fare coi soliti caproni..
    No, non è questo ... è seccante ripetere sempre di fare una ricerca sul forum prima di postare ...

    Dando una veloce occhiata, dovrei aggiungere
    fflush(stdin);
    dopo la richiesta del separatore?
    Ecco ... vedi ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    E poi, perchè bisogna fare questa cosa?Dove sgarra scanf?
    Una cosa poi che non capisco, e' che in alcuni codici, trovo scanf("%cn",&c);
    quella n a che serve?
    Scusatemi per le troppe domande, e, per non aver saputo trovare le risposte da me.
    Ho trovato però 3 modi per ovviare al mio problema, vorrei sapere se e quali sono le differenze..

    1) printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    fflush(stdin);
    printf("Inserisci separatore date: \n");
    scanf("%c",&s);

    2)
    printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    while( getchar() != '\n' );
    printf("Inserisci separatore date: \n");
    scanf("%c",&s);

    3)
    printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    printf("Inserisci separatore date: \n");
    s=getchar();
    scanf("%c",&s);

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da eltonio
    1) printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    fflush(stdin);
    printf("Inserisci separatore date: \n");
    scanf("%c",&s);
    Soluzione non portabile. fflush() richiamata su stdin (e, in generale, su qualsiasi stream di input) dà luogo ad un undefined behavior. Secondo lo standard, infatti:

    If stream points to an output stream or an update stream in which the most recent
    operation was not input, the fflush function causes any unwritten data for that stream
    to be delivered to the host environment to be written to the file; otherwise, the behavior is
    undefined.
    per il significato di "the behavior is undefined" rimando alla mia firma.

    2)
    printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    while( getchar() != '\n' );
    printf("Inserisci separatore date: \n");
    scanf("%c",&s);

    3)
    printf("Inserisci anno di inizio:\n");
    scanf("%4d",&i);
    printf("Inserisci anno di fine:\n");
    scanf("%4d",&f);
    printf("Inserisci separatore date: \n");
    s=getchar();
    scanf("%c",&s);
    entrambe mirano ad eliminare il newline dal buffer di stdin ma la seconda è più generica della terza dato che legge e scarta dal buffer qualsiasi carattere fino al newline.
    every day above ground is a good one

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.