Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    11

    [C] tutto bene tranne il bisestile

    ciao a tutti...qualche anima pia potrebbe farmi capire per quale motivo mi stampa tutte le date per bene tranne il bisestile...grazie mille per la risposta

    codice:
    #include <stdio.h>
    
    int main()
    {
        int gg, mm, aaaa;
        char *mese[12] = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
        int bis=((aaaa % 4 == 0 && aaaa % 100 != 0) || aaaa % 400 == 0);
    
        printf("Inserire una data: ");
        scanf("%d/%d/%d", &gg, &mm, &aaaa);    
                                      
        while(1){ 
                 if((mm==2 && gg>28) || (mm==4,6,9,11 && gg>30) || (mm==1,3,5,7,8,10,12 && gg>31) || (mm==2 && gg==29 && aaaa!=bis)){
                 printf("Data errata!!!\nInserire nuova data:");
                      scanf("%d/%d/%d", &gg, &mm, &aaaa);
                 
                 }
                 else{       
                      printf("%d %s %d", gg, mese[mm-1], aaaa);
                      break;                                   
                 }                 
           }           
     return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Questa sintassi usata per scrivere i confronti

    mm==4,6,9,11

    non e' del C.

    I confonti si devono fare sempre tra due elementi e il risultato si lega con gli altri (vedi algebra booleana). Quindi

    (mm==4) || (mm==6) || (mm==9) || (mm==11)

    Se scrivi nell'altro modo, sebbene compilabile, il comportamento sarà diverso e il risultato sarà imprevedibile.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Penso che il controllo bis vada fatto DOPO lo scanf.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da XWolverineX
    Penso che il controllo bis vada fatto DOPO lo scanf.
    Sicuramente ...

    Insomma ... il programma presenta delle lacune abbastanza gravi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    11
    prima di tutto grazie per la risposta.poi...ho scritto come hai detto tu...funziona sempre tutto bene tranne che per il 29 febbraio degli anni bisestili...non so proprio + dove guardare...

    codice:
    #include <stdio.h>
    
    int main()
    {
        int gg, mm, aaaa;
        char *mese[] = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
        int bis=((aaaa % 4 == 0 && aaaa % 100 != 0) || aaaa % 400 == 0);
    
        printf("Inserire una data: ");
        scanf("%d/%d/%d", &gg, &mm, &aaaa);    
                                      
        
        while(1){ 
                 if(((mm==2) && (gg>28)) || (((mm==4)||(mm==6)||(mm==9)||(mm==11)) && (gg>30)) || (((mm==1)||(mm==3)||(mm==5)||(mm==7)||(mm==8)||(mm==10)||(mm==12)) && (gg>31)) || ((mm==2 && gg==29) && (aaaa!=bis))){
                      printf("Data errata!!!\nInserire nuova data:");
                      scanf("%d/%d/%d", &gg, &mm, &aaaa);     
                 
                 }
                 else{       
                      printf("%d %s %d", gg, mese[mm-1], aaaa);
                      break;                                  
                 }                 
               
        }           
     return 0;
    
    
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    15
    Avevo lo stesso problema, praticamente mettendo tutto nello stesso if, il programma risolve prima la possibilità gg > 28 e stampa sempre come data errata se gli fornisci come input una qualsiasi data che abbia più di 28 giorni a febbraio(anche se bisestile).
    Ho risolto semplicemente facendo un altro if con condizione opposta alla verifica dell'anno bisestile.

  7. #7
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    cioè ci sono 3 thread sullo stesso problema?del quale oltretutto è stata già postata la soluzione?
    siete tutti colleghi immagino..

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    15
    Originariamente inviato da ant_alt
    cioè ci sono 3 thread sullo stesso problema?del quale oltretutto è stata già postata la soluzione?
    siete tutti colleghi immagino..
    Anche l'altro nel mio topic dava lo stesso problema con i bisestili.

  9. #9
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da Janbure
    Anche l'altro nel mio topic dava lo stesso problema con i bisestili.
    codice:
    #include <stdio.h>
        int main ()
        {
        char*nm[]={"gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"};
        int gg, mm, aa;
        printf("Inserire data nel formato gg/mm/aa: ");
        scanf("%d/%d/%d", &gg, &mm, &aa);
        bool isLeap=(aa % 4 == 0 && aa % 100 != 0) || aa % 400 == 0;
        if((isLeap&&mm==2&&gg>29)||
        gg>31||
        (!isLeap&&mm==2&&gg>28)||
        ((mm ==1||mm==4||mm==6||mm==9||mm==11)&&gg>30)){
                printf("Data non valida\n");
                getchar();getchar();
                return 0;
                }
        printf("%d/%d/%d\n", gg,mm,aa);
        printf("%d %s %d\n", gg,nm[mm-1],aa);
        getchar();getchar();  getchar();getchar();
        
        return 0;
        }

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    In ogni caso, in un programma, si fa PRIMA l'input dei dati con

    scanf("%d/%d/%d", &gg, &mm, &aaaa);

    e DOPO il controllo con

    int bis=((aaaa % 4 == 0 && aaaa % 100 != 0) || aaaa % 400 == 0);

    Non ha senso controllare dei dati che non hai ancora inserito ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.