Aiuto programma di Fibonacci

di il
4 risposte

Aiuto programma di Fibonacci

Buon pomeriggio dovrei scrivere un programma con un file di input e uno di output dove dovrò scrivere la sequenza di Fibonacci.
Ho scritto il programma ma non riesco a stampare nel file di output la sequenza giusta di Fibonacci perché non riesco a trovare i primi due 1 della sequenza.
Vi allego la traccia e il programma che ho fatto.

TRACCIA
*
* Sia dato un file contente una sequenza di interi positivi.
* Si vuole verificare se tale sequenza contiene un sottoinsieme di elementi, che
* rispettando l'ordine dato, costituisca una parte della successione di Fibonacci.
* Si ricordi che la successione di Fibonacci è una successione di numeri interi positivi
* in cui ciascun numero è la somma dei due precedenti e i primi due termini della successione
* sono per definizione F1=1 e F2=1.
* Scrivere un programma C che letta da file la sequenza di interi positivi, verifichi se esiste una
* sotto-sequenza che sia costituita dai primi N elementi della successione di Fibonacci.
* Il programma deve stampare in un nuovo file (il cui nome è dato in input da tastiera)
* gli elementi delle sequenza iniziale e
* gli indici della sequenza che costituiscono la (parte di) successione di Fibonacci contenuta.
*
*
*

Un esempio di file di input e' il seguente:
*
* 7 1 4 7 1 5 2 3 4 5 9 6 8 11
*
* Un esempio di esecuzione e':
*
* >>>Inserire nome file input: in.txt
*
* >>>Inserire nome file output: in.txt
*
* Il file out.txt conterrà :
*
* Numero elementi della sequenza iniziale: 14
* Indici della successione di Fibonacci estratta:
* 1 4 6 7 9 12
*
*
*/

#include <stdio.h>
#include <stdlib.h>
#define DIMR 20
#define NCAR 100

/* Prototipi delle funzioni  */

int LeggiSequenza(char [], int S[DIMR], int *m );
int Fibonacci(int S[DIMR],int n, int m);
int ScriviSeq(char [], int S[DIMR], int r, int c, int val);
int  StampaSequenza(int S[DIMR], int r, int c);

int main(int argc, char** argv) {
int S[DIMR];
  char  nomefile[NCAR];
    int r, c, val;

    
     
    printf("Inserire nome file di input >");
    scanf("%s", nomefile);

    /* Legge la sequenza di interi  da file e costruisce la seguenza*/
    r=LeggiSequenza(nomefile, S, &c);



    /* Stampa Seguenza a video */
    StampaSequenza(S,r,c);


    /* Verifica se la seguenza è di Fibonacci */
    val = Fibonacci(S, r, c);
    if (val)
        printf("Seguenza di Fibbonacci.\n");
    else
        printf("Non è una seguenza di Fibbonacci");

       
    printf("Inserire nome file di output >");
    scanf("%s", nomefile);
        /* Stampa su file la matrice e dice se è o no una matrice FRAME*/
        ScriviSeq(nomefile, S, r, c, val);
    return (EXIT_SUCCESS);
}

int LeggiSequenza(char nomefile[], int S[DIMR], int *m )
{
    int i;
    FILE* file= fopen(nomefile,"r");
    if(file==NULL){
        printf("Errore nell'apertura del file %s\n",nomefile);
        return EXIT_FAILURE;
    }
    fscanf(file,"%d",m);
    if(*m>DIMR){
        printf("La dimensione massima è %d\n",DIMR);
        return 0;
   }
    while(!feof(file)){
        for(i=0;i<*m;i++) 
         
            fscanf(file, "%d\n", &S[i]);
        
     
       i;
    }
   
    fclose(file);
    
   return i;
    
}


int Fibonacci(int S[DIMR],int n, int m)
{
//LA PARTE DOVE HO PROBLEMI 

}


int ScriviSeq(char nomefile[], int S[DIMR], int r, int c, int val)
{
   int i;
    FILE* file=fopen(nomefile, "w");
    if(file==NULL){
        printf("errore nell'apertura del file %s\n",nomefile);
        return 1;
    }
    
    for(i=0; i<r; i++){
        
            fprintf(file, "%d", S[i]);
        
        fprintf(file,"\n");
    }
    fclose(file);
    
    return 0;                      
}

                                              




// La funzione stampa la successione a video

int StampaSequenza(int S[DIMR], int r, int c)
{
    int i;
for(i = 0; i < r; i++) {
    printf("%d ",S[i]);
        
        printf("\n");
    }
} 


Il mio file di input è:

7 1 4 7 1 5 2 3 4 5 9 6 8 11



grazie mille in anticipo per chi mi potrà aiutare

P.S.: Il linguaggio in uso è il C

4 Risposte

  • Re: Aiuto programma di Fibonacci

    Non sono un esperto, bensì un praticone autodidatta, però mi sembra che ci siano diverse cose che non quadrano, a partire dal modo in cui leggi la sequenza dei dati da file in LeggiSequenza(): nel testo dell'esercizio non si dice che il primo dei valori indica la quantità dei valori presenti nella sequenza. Per controllare che quella quantità non "sfondi" il buffer disponibile (cosa più che opportuna) dovresti scorrere tutti i valori come se li stessi leggendo per importarli, contandoli, quindi "riavvolgere" il file con rewind() e rileggerli nuovamente per caricarli effettivamente nel buffer. Io farei così (tutto da verificare, eh!):
    int LeggiDaFile( char *nomefile, int *seq, int *dim_seq ) {
        int aux, quantita_valori=0;
    
        *dim_seq=0;
    
        FILE *file = fopen( nomefile, "r" );
    
        if( NULL == file ){
            printf( "Errore nell'apertura del file %s\n", nomefile );
            return EXIT_FAILURE;
        }
    
        while( 1==fscanf(file,"%d\n",&aux) )
            ++quantita_valori;
    
        if( quantita_valori > DIMR ) {
            printf( "Troppi valori nel file %s (max: %d)\n", nomefile, DIMR );
            fclose( file );
            return EXIT_FAILURE;
        }
    
        rewind( file ); // torna all'inizio del file
    
        for( aux=0; 1==fscanf(file,"%d\n",&seq[aux]); ++aux );
    
        fclose( file );
    
        if( aux == quantita_valori ) {
            *dim_seq = quantita_valori;
            return EXIT_SUCCESS;
        }
        else {
            printf( "Errore nella lettura dei valori da file %s\n", nomefile );
            return EXIT_FAILURE;
        }
    }
    In alternativa, potresti caricare direttamente i dati nel buffer, interrompendo il caricamento e segnalando l'errore in caso di "sfondamento", ma da testi che ho letto pare sia consigliato restituire al chiamante i buffer intatti in caso di errore.

    Una buona pratica sarebbe anche controllare sempre che i puntatori siano validi (e io non l'ho fatto...).

    In merito alla successione di Fibonacci, nota che non chiede i valori, ma i loro indici. A me è venuto in mente di scorrere i valori nella sequenza caricata dal file, ricavandoli "al volo" in un minibuffer fib[2] e memorizzando gli indici man mano che quei valori si presentano. La cosa dovrebbe funzionare, tenendo conto che nella traccia si dice che i valori della successione si presentano nella sequenza originale "rispettando l'ordine dato".
    int RilevaIndiciFibonacci( int *seq_fib, int *seq, int dim_seq ) {
        int fib[2] = { 1, 1 };
        int i, dim_seq_fib;
    
        for( dim_seq_fib=0, i=0; i<dim_seq; ++i ) {
            if( seq[i] == fib[0] ) {
                int aux;
                aux = fib[0] + fib[1];
                fib[0] = fib[1];
                fib[1] = aux;
                seq_fib[dim_seq_fib++] = i;
            }
        }
    
        return dim_seq_fib; // notifichiamo quanti sono i valori rilevati
    }
    E' ben vero che i valori rilevati si potrebbero scrivere direttamente sul file senza prima immagazzinarli in seq_fib, ma è una mia mania quella di caricare tutto prima di lavorarci (non sto dicendo che è una buona pratica, solo che io son solito fare così). Il buffer che ho usato per seq_fib è di dimensioni uguali a quelle di seq per poter fronte al caso più "oneroso", per cui in questo caso non serve fare controlli "antisfondamento".

    Con altre modifiche che non indico, l'output della mia versione del programma è...
    Inserire nome file di input >input.txt
    
    Sequenza dei valori originali:
    7 1 4 7 1 5 2 3 4 5 9 6 8 11
    
    Quantita' dei valori nella sequenza originale: 14
    
    Indici dei valori della successione di Fibonacci rilevati:
    1 4 6 7 9 12
    
    Quantita' dei valori della successione di Fibonacci rilevati: 6
    
    Inserire nome file di output >output.txt
    
    Premi "invio" per lasciare il programma... >
    P.S. Per chiedere il nome dei file userei fgets() anziché scanf(), in caso un nome contenesse degli spazi...
  • Re: Aiuto programma di Fibonacci

    La ringrazio
  • Re: Aiuto programma di Fibonacci

    Non mi funziona
  • Re: Aiuto programma di Fibonacci

    Come ti dicevo, c'è qualcosa che non va anche altrove, al di fuori delle funzioni che ti ho indicato.
Devi accedere o registrarti per scrivere nel forum
4 risposte