|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2009
Messaggi: 83
|
[C] Calcolo del fattoriale e differenti output
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 : Codice:
#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");
}
Codice:
for ( ; numero > 0; fattoriale *= --numero) 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". Ultima modifica di Ragazzo triste : 04-08-2009 alle 02:49. |
|
|
|
|
|
#2 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Consideriamo la versione:
for ( ; numero > 0; fattoriale *= --numero) Supponiamo di avere F=fattoriale e N=numero (uso F ed N per brevità). La tua soluzione equivale al seguente codice: F = 1; N = 3; //valore da input while(true) { if(N <= 0) return; N = N - 1; F = F * N; } Vediamo allora cosa succede: 1) N > 0 ??? Vero (N == 3) 2) N = N-1 ; F = F * N. Quindi al termine del primo ciclo si avrà N==2 e F==2. 3) N > 0 ??? Vero (N == 2) 4) N = N-1 ; F = F * N. Quindi al termine del secondo ciclo si avrà N==1 e F==2. 5) N > 0 ??? Vero (N == 1) 6) N = N-1 ; F = F * N. Quindi al termine del terzo ciclo si avrà N==0 e F==0. 7) N > 0 ??? Falso (N == 0) Il programma termina. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2009
Messaggi: 83
|
Ciao e grazie per aver risposto (addirittura alle 3 di notte !!!)...adesso è tutto chiaro.
In effetti bastava trasformare i cicli for nei corrispondenti while esplicitati. Ne viene che nella 1a versione del programma il ciclo for equivale a : Codice:
while (numero > 0)
{fattoriale=fattoriale*numero;
numero=numero-1;}
Codice:
while (numero > 0)
{fattoriale=fattoriale*(numero-1);
numero=numero-1;}
Ciao e grazie per la disponibilità Notte |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2009
Messaggi: 83
|
Edit,doppio post...scusate
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Buona programmazione
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:05.




















