Programma in C sulla successione di Fibonacci
Ragazzi non capisco perchè questo programma mi da problemi,voi vedete qualche errore?
Grazie!
[mod="Raptorista"]Aggiungo tag codice[/mod]
# include <stdlib.h> # include <stdio.h> int main (void) { int a,x,y,j; printf("immetti valore numerico "); scanf("%d",&a); x=1; y=0; j=0; printf("%d",&y); while(y<=a) { y=j+x; printf("%d",&y); j=x; x=y; } system ("PAUSE"); return 0; }
Grazie!
[mod="Raptorista"]Aggiungo tag codice[/mod]
Risposte
direi che hai inizializzato male una variabile e messo in ordine sbagliato l'assegnazione;
prova così, lasciando questo ordine:
Capisci perchè è questo l'ordine e si inizializza a 1 (vedi la definizione della sucessione di Fibonacci)?
PS: ti consiglio di non usare system(PAUSE) è davvero mala programmazione
prova così, lasciando questo ordine:
j=x=y=1; for(int i = 2;i<=a;i++){ j=x; x=y; y=j+x; }
Capisci perchè è questo l'ordine e si inizializza a 1 (vedi la definizione della sucessione di Fibonacci)?
PS: ti consiglio di non usare system(PAUSE) è davvero mala programmazione

Provo...ma perchè non usare system pause?quale funzione usare?
"Mrhaha":
Provo...ma perchè non usare system pause?quale funzione usare?
idealmente, nulla
se proprio proprio devi per forza fare qualcosa usa
char trash; scanf("%c",&trash);
che perlomeno è C pulito
Nota che si può usare l'asterisco per ignorare ciò che viene letto. Ad esempio,
legge, ma ignora, una stringa inserita in input.
scanf("%*s");
legge, ma ignora, una stringa inserita in input.
Riguardo al problema del post, che pensavo fosse stato risolto, c'è un errore grave nell'uso di printf. Infatti,
stampa l'indirizzo in memoria di y invece che il suo valore. È solo nello scanf che devi mettere & prima del nome della variabile (credo che una spiegazione di questo comportamento vada un po' oltre le tue conoscenze del C e porterebbe troppo lontano). Il metodo corretto di stampare il valore di y è:
dove sono andato a capo tra i diversi valori per poterli comprendere meglio. C'è poi il problema della inizializzazione come già descritto in precedenza e di ordine nell'aggiornamento dei valori. Il seguente codice è un esempio di codice corretto (ispirato al tuo):
printf("%d",&y);
stampa l'indirizzo in memoria di y invece che il suo valore. È solo nello scanf che devi mettere & prima del nome della variabile (credo che una spiegazione di questo comportamento vada un po' oltre le tue conoscenze del C e porterebbe troppo lontano). Il metodo corretto di stampare il valore di y è:
printf("%d\n", y);
dove sono andato a capo tra i diversi valori per poterli comprendere meglio. C'è poi il problema della inizializzazione come già descritto in precedenza e di ordine nell'aggiornamento dei valori. Il seguente codice è un esempio di codice corretto (ispirato al tuo):
# include <stdlib.h> # include <stdio.h> int main(void) { int a, f0 = 0, f1 = 1, f2 = 1; printf("Immetti il valore massimo da raggiungere: "); scanf("%d",&a); /* stampo i primi due valori. */ printf("%d\n", f0); printf("%d\n", f1); /* devi verificare che f2 sia maggiore di a dopo averlo aggiornato * e non prima. In caso contrario l'ultimo numero sarà il primo * maggiore del massimo e non l'ultimo minore. */ while(f2 <= a) { printf("%d\n", f2); f0 = f1; f1 = f2; f2 = f0 + f1; } printf("Premi invio per chiudere...\n"); scanf("%*c%*c"); /* c'è già un a capo nello stream e quindi ne servono due di %*c */ return 0; }
Di alcuni errori me ne sono accorto quando ham_burst mi ha suggerito come fare,come ad esempio l'uso del printf che era assolutamente sbagliato! Era il primo programma che ho fatto,quindi tutto sommato poteva andare peggio! Però non ho capito l'uso degli asterischi! A cosa servono funzionalmente?
"Mrhaha":
Di alcuni errori me ne sono accorto quando ham_burst mi ha suggerito come fare,come ad esempio l'uso del printf che era assolutamente sbagliato! Era il primo programma che ho fatto,quindi tutto sommato poteva andare peggio! Però non ho capito l'uso degli asterischi! A cosa servono funzionalmente?
%c = prendi un carattere, mettilo all'indirizzo che ti passo come argomento (&nomevariabile)
%*c = prendi un carattere, ignoralo
ah!ma perchè dovrei ignorarlo nella fattispecie?
"Mrhaha":
ah!ma perchè dovrei ignorarlo nella fattispecie?
perché tu vuoi che l'utente prema invio, ma non ti interessa memorizzare il carattere "invio" da qualche parte
Ah! Capisco! Gentilissimo!