Programma in C sulla successione di Fibonacci

Mrhaha
Ragazzi non capisco perchè questo programma mi da problemi,voi vedete qualche errore?
# 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
hamming_burst
direi che hai inizializzato male una variabile e messo in ordine sbagliato l'assegnazione;

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 :-)

Mrhaha
Provo...ma perchè non usare system pause?quale funzione usare?

miniBill
"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

apatriarca
Nota che si può usare l'asterisco per ignorare ciò che viene letto. Ad esempio,
scanf("%*s");

legge, ma ignora, una stringa inserita in input.

apatriarca
Riguardo al problema del post, che pensavo fosse stato risolto, c'è un errore grave nell'uso di printf. Infatti,
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;
}

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?

miniBill
"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

Mrhaha
ah!ma perchè dovrei ignorarlo nella fattispecie?

miniBill
"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

Mrhaha
Ah! Capisco! Gentilissimo!

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