Anno bisestile

Kashaman
Altro semplice programma scritto in C, stabilisce se un dato anno preso in input e' bisestile oppure no.
Prende valori per $anni>0$. Fatemi sapere che ne pensate
/* Decisione anno bisestile */
main()
{ 
    int anno;
    printf("Tale programma stabilisce se un dato anno preso in imput \n e' o meno bisestile \n, vengono valutati gli anni dopo di cristo \n, premi 0 per uscire dal programma\n");
    do {
    printf("inserisci anno\n");
    scanf("%d",&anno);
    if ((anno%100)==0) {
                       if ((anno % 400)==0)printf("l'anno e' bisestile\n"); else printf("l'anno non e' bisestile\n"); }
                       else {
    if ((anno%4)==0) printf("l'anno e' bisestile\n"); else printf("l'anno non e' bisestile\n");}
} while (anno !=0) ;}

Risposte
Rggb1
Fai economia:
int nb;
//...
nb=(anno%4);
//...
printf("\nL'anno ");
if (nb) printf("non ");
printf("e' bisestile.");

Gi81
@Rggb: Il problema è che anche $1900$ e $1800$ non sono bisestili, pur essendo divisibili per $4$.
La regola è la seguente: Un anno è bisestile se il suo numero è divisibile per $4$, con l'eccezione degli anni secolari (quelli divisibili per $100$) che non sono divisibili per $400$.

@Kashaman: direi che va bene, ma non ottimizza molto. Infatti tu fai come primo controllo il modulo $100$.
Io farei come primo controllo il modulo $4$:

...
if ((anno%4)!=0) 
   printf(" non ");
else
   if ( (anno%100)==0  && (anno%400)!=0) ) 
       printf(" non ");
...

che volendo si può compattare in
...
if (  ((anno%4)!=0)    || ((anno%100)==0  && (anno%400)!=0 )   )
   printf(" non ");
...

Rggb1
"Gi8":
@Rggb: Il problema è che anche $1900$ e $1800$ non sono bisestili, pur essendo divisibili per $4$.

Il mio suggerimento non è di alterare la logica - che va bene - ma di fare economia:
- assegnare ad una variabile il risultato del controllo bisestile si/no;
- stampare solo alla fine, e stampare "non" solo se è bisestile.

[ Vedasi anche i commenti //... ]

Gi81
Pardon, non avevo proprio capito. Chiedo scusa :-)

Kashaman
Grazie mille! seguirò i consigli di entrambi!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.