Fibonacci in C++
Ho scritto un programma molto semplice che calcola i primi n numeri usando la stessa idea della successione di Fibonacci:
$a_n=a_(n-2)+a_(n-1)$.
L'idea è che il computer, dati due numeri e il numero di elementi della successione da calcolare, vada a salvare i risultati (numero della successione e indice) sul file fib.txt; andare a riprenderli uno ad uno e stamparli su schermo.
Ora, la questione è che i file vengono salvati correttamente ma quando vado a ripescarli ho idea che l'estrazione dei dati cada in uno stato di guasto. Questo è il codice completo:
I valori vengono salvati in questo modo nel file, per esempio:
1 1
1 2
2 3
Il ciclo while, commentato, per la stampa su schermo da file è funzionante.
Ma la parte sulla quale vi sto chiedendo aiuto è:
Volevo usare l'idea di far assumere alla variabile d'ingresso il valore 'falso' in modo da interrompere il ciclo. Ho quindi fatto in modo che si legga ogni volta il carattere successivo all'indice e lo si memorizzi nella variabile $d$ di tipo char. Mi aspettavo il ciclo proseguisse sereno fino alla lettura del 3 e andando oltre non trovasse nulla da assegnare a $d$. ingresso avrebbe assunto il valore 'falso', il ciclo sarebbe entrato nell'if per poi interrompersi.
Ma quello che in realtà succede è che i valori stampati su schermo sono del tipo:
Qualcuno ha idea di dove sbagli?
$a_n=a_(n-2)+a_(n-1)$.
L'idea è che il computer, dati due numeri e il numero di elementi della successione da calcolare, vada a salvare i risultati (numero della successione e indice) sul file fib.txt; andare a riprenderli uno ad uno e stamparli su schermo.
Ora, la questione è che i file vengono salvati correttamente ma quando vado a ripescarli ho idea che l'estrazione dei dati cada in uno stato di guasto. Questo è il codice completo:
/* Programma che calcola una sequenza di Fibonacci fino all'indice n-esimo a partire da due numeri iniziali a e b. */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main(){ int n; double a,b,c; int p=3; char d,spazio=' '; ifstream ingresso; ofstream uscita; uscita.open("fib.txt"); cout<<"Inserisci due valori a e b " <<"e il numero di valori da calcolare e stampare (in ordine): "; cin>>a>>b>>n; cout<<'\n'; c=a+b; uscita<<a<<spazio<<'1'<<endl; uscita<<b<<spazio<<'2'<<endl; a=b; b=c; while(p<n){ c=a+b; uscita<<c<<spazio<<p<<endl; a=b; b=c; p++; } c=a+b; uscita<<c<<spazio<<n; uscita.close(); ingresso.open("fib.txt"); p=0; /*while(!ingresso.eof()){ ingresso>>c; cout<<c<<spazio; ingresso>>c; cout<<c<<endl; p++; }*/ while(1){ ingresso>>c; cout<<c<<spazio; ingresso>>c>>d; cout<<c<<endl; if(!ingresso) break; } cout<<'\n'<<'\n'; ingresso.close(); return 0; }
I valori vengono salvati in questo modo nel file, per esempio:
1 1
1 2
2 3
Il ciclo while, commentato, per la stampa su schermo da file è funzionante.
Ma la parte sulla quale vi sto chiedendo aiuto è:
while(1){ ingresso>>c; cout<<c<<spazio; ingresso>>c>>d; cout<<c<<endl; if(!ingresso) break; }
Volevo usare l'idea di far assumere alla variabile d'ingresso il valore 'falso' in modo da interrompere il ciclo. Ho quindi fatto in modo che si legga ogni volta il carattere successivo all'indice e lo si memorizzi nella variabile $d$ di tipo char. Mi aspettavo il ciclo proseguisse sereno fino alla lettura del 3 e andando oltre non trovasse nulla da assegnare a $d$. ingresso avrebbe assunto il valore 'falso', il ciclo sarebbe entrato nell'if per poi interrompersi.
Ma quello che in realtà succede è che i valori stampati su schermo sono del tipo:
1 1 1 2 2 3 3 3
Qualcuno ha idea di dove sbagli?
Risposte
Ciao,
non ho guardato il codice ancora, ma ti dico che questo problema è stato discusso decinaia di volte in questa sezione, per avere informazioni in merito alle più diverse forme di risoluzione di consiglio di cercarle nei vecchi post
Per il tuo codice che oltre l'algoritmo di risoluzione del Fibonacci, utilizza input/output da file di testo c'è bisogno di altro (oltre la visione di vecchi post).
Prima di tutto questo:
Il ciclo infinito intenzionale NON si fa (almeno se tu non sappia cosa stai scrivendo e del perchè). L'utilizzo del break con condizione di uscita dovuta ad un input esterno (adirittura da un file) è davvero cattiva programmazione.
C'è da ristrutture il ciclio, prova a pensare a come puoi togliere il ciclo infinito e il break, domandati: quale è la condizione di uscita e dove la dovrei mettere?
il resto se ne riparla domani
non ho guardato il codice ancora, ma ti dico che questo problema è stato discusso decinaia di volte in questa sezione, per avere informazioni in merito alle più diverse forme di risoluzione di consiglio di cercarle nei vecchi post

Per il tuo codice che oltre l'algoritmo di risoluzione del Fibonacci, utilizza input/output da file di testo c'è bisogno di altro (oltre la visione di vecchi post).
Prima di tutto questo:
"giuscri":
while(1){ ingresso>>c; cout<<c<<spazio; ingresso>>c>>d; cout<<c<<endl; if(!ingresso) break; }
Il ciclo infinito intenzionale NON si fa (almeno se tu non sappia cosa stai scrivendo e del perchè). L'utilizzo del break con condizione di uscita dovuta ad un input esterno (adirittura da un file) è davvero cattiva programmazione.
C'è da ristrutture il ciclio, prova a pensare a come puoi togliere il ciclo infinito e il break, domandati: quale è la condizione di uscita e dove la dovrei mettere?
il resto se ne riparla domani
