Ragazzo triste
04-08-2009, 01:43
Salve amici,qualche anima pia è in grado di chiarirmi le idee sul perché,in queste 2 differenti versioni di programma in C per il calcolo del fattoriale di un numero,gli output sono differenti ?
Eccovi la prima versione del programma,con la variabile numero postdecrementata :
#include <stdio.h>
#include <stdlib.h>
main(){
int numero = 0;
double fattoriale = 1;
printf("Inserire un numero > 0 di cui calcolare il fattoriale ");
scanf("%d", &numero);
if( numero > 0 ){
for ( ; numero > 0; fattoriale *= numero--) /* la variabile numero viene postdecrementata */
;
printf("Il fattoriale vale %f\n", fattoriale);
}
else {
printf("calcolo impossibile...bye\n");
}
system("PAUSE");
}
e poi vi dò la 2a versione del programma,dove non cambia niente eccetto la variabile numero che viene predecrementata...quindi il for (peraltro senza corpo di istruzioni) sarà
for ( ; numero > 0; fattoriale *= --numero)
Il problema è questo : se inserisco un numero,ad es.4,col primo programma mi calcola correttamente il fattoriale,cioè 24.
Con il 2° programma,invece,mi dà il fattoriale pari a 0.
E non capisco perché.
A rigor di logica (almeno lo spero) il ragionamento che ho fatto è questo : nella 2a versione del programma,con variabile predecrementata,il fattoriale in partenza è =1...e poi (se il numero in input è 4) viene moltiplicato per (4-1),cioè 3 ; poi ancora per (3-1),cioè 2,e infine ancora per 1.Il fattoriale dovrebbe uscire pari a 6 (valore comunque sbagliato)...invece stranamente esce pari a 0.
Tutto questo perché,quando si usa il predecremento di una variabile,essa viene appunto prima decrementata,poi valutata,ed infine impiegata nelle espressioni e nelle operazioni con altri operandi o numeri.
E' un problema di tracking dell'algoritmo,vero ?
Spero che qualcuno abbia la pazienza di aiutarmi ad individuare dove sbaglio nel ragionamento...o comunque a spiegare il perché di questo piccolo "mistero".
Eccovi la prima versione del programma,con la variabile numero postdecrementata :
#include <stdio.h>
#include <stdlib.h>
main(){
int numero = 0;
double fattoriale = 1;
printf("Inserire un numero > 0 di cui calcolare il fattoriale ");
scanf("%d", &numero);
if( numero > 0 ){
for ( ; numero > 0; fattoriale *= numero--) /* la variabile numero viene postdecrementata */
;
printf("Il fattoriale vale %f\n", fattoriale);
}
else {
printf("calcolo impossibile...bye\n");
}
system("PAUSE");
}
e poi vi dò la 2a versione del programma,dove non cambia niente eccetto la variabile numero che viene predecrementata...quindi il for (peraltro senza corpo di istruzioni) sarà
for ( ; numero > 0; fattoriale *= --numero)
Il problema è questo : se inserisco un numero,ad es.4,col primo programma mi calcola correttamente il fattoriale,cioè 24.
Con il 2° programma,invece,mi dà il fattoriale pari a 0.
E non capisco perché.
A rigor di logica (almeno lo spero) il ragionamento che ho fatto è questo : nella 2a versione del programma,con variabile predecrementata,il fattoriale in partenza è =1...e poi (se il numero in input è 4) viene moltiplicato per (4-1),cioè 3 ; poi ancora per (3-1),cioè 2,e infine ancora per 1.Il fattoriale dovrebbe uscire pari a 6 (valore comunque sbagliato)...invece stranamente esce pari a 0.
Tutto questo perché,quando si usa il predecremento di una variabile,essa viene appunto prima decrementata,poi valutata,ed infine impiegata nelle espressioni e nelle operazioni con altri operandi o numeri.
E' un problema di tracking dell'algoritmo,vero ?
Spero che qualcuno abbia la pazienza di aiutarmi ad individuare dove sbaglio nel ragionamento...o comunque a spiegare il perché di questo piccolo "mistero".