Problema esegui operazioni lette da file

di il
10 risposte

Problema esegui operazioni lette da file

Buona sera a tutti, ho un problema, non riesco ad implementare un algoritmo decente che legga da file una serie di operazioni, es. 10 * 5, e li salvi in una matrice char, ogni operazione deve essere salvata su un diverso livello della matrice. Quello che sto utilizzando è poco funzionale ed alcune volte mi da risultati sbagliati, perchè la grandezza che mi calcolo con strlen() è maggiore di quella effettiva. Nel file ci possono un n indefinito di sbazi e tab fra i numeri e i veri segni +, *, -, /.

Questa è la funzione che esegue il calcolo:
/*
 La funzione Esegui_Operazioni prende in ingresso la matrice di char contenente le operazioni, il
 vettore di interi destinato a contenere i risultati di ogni operazione e il numero di operazioni (righe
 della matrice) da effettuare. Effettua le operazioni, determinando il primo operando, l'operazione 
 e il secondo operando (si deve effettuare una conversione da ascii a numerico) e immagazzina il risultato
 nel vettore dei risultati.
 */
void Esegui_Operazioni(char str[][NCAR], int r[], int n)
{
    int i, j, k;
    char op;
    int x1 = 0, x2 = 0;
    
    for ( i = 0; i < n; i++ ){
        x1 = 0;
        x2 = 0;
        for ( j = 0; j <= ( strlen( str[i] )); j++) {
            if( str[i][j] == '+'){
                op =43;
                break;
            }
            if( str[i][j] == '*'){
                op =42;
                break;
            }
            if( str[i][j] == '-'){
                op =45;
                break;
            }
            if( str[i][j] == '/'){
                op =47;
                break;
            }
        }
        printf("j == %d\n", j);
        printf("op == %c\n", op);
        printf("%zd\n", strlen ( str[ i ] ) );
        if ( j >= 2 )
            for( k = 0; k < j; k++) {
                x1 += ( str[i][k] - 48 )* pow( 10, j - 1 ) /pow( 10, k);
                printf("x1 === %d\n", x1);
            }
        else
            x1 = str[i][0] -48;
        
        if( ( strlen( str [i] ) - j) >= 2 )
            for( k = j+1; k <= ( strlen( str[i] )); k++) {
                x2 += ( str[i][k] - 48 )* pow( 10, (strlen( str[i] ))) /pow( 10, k );
                printf("x2 === %d\n", x2);
            }
        else
            x2 = str[i][ j +1 ] -48;
        
        if( op == 43)
            r[ i ] = x1 + x2;
        if( op == 42)
            r[ i ] = x1 * x2;
        if( op == 45)
            r[ i ] = x1 - x2;
        if( op == 47)
            r[ i ] = x1 / x2;
    }
    
    
}
Questa è la funzione che utilizzo per salvare da file:
/*
 La funzione Leggi_Operazioni prende in ingresso il puntatore al file
 di dati in input e la matrice di caratteri destinata a contenere le operazioni
 da immagazzinare. Legge le operazioni, omettendo gli spazi bianchi, e restituisce
 il numero di operazioni lette.
 */
int Leggi_Operazioni(FILE *fpin, char str[][NCAR])
{
    int i = 0, j = 0;
    
    for( i = 0; i < MAXOP; i++) {
        for( j = 0; j < NCAR; j++) {
            do {
                fscanf( fpin, "%c", &str[i][j]);
            }while ( str[i][j] == ' ');
            if( str[i][j] == '\n' || feof( fpin ) )
                break;
        }
        if ( feof( fpin ) )
            break;
    }
    
    
    return i+1;
}
Aiutatemi pls

10 Risposte

  • Re: Problema esegui operazioni lette da file

    Prima di tutto, le linee che ci possono essere nel file, come sono ? Possono essere anche operazioni del tipo

    5 + 8 * 2 - 3 / 2

    ??
  • Re: Problema esegui operazioni lette da file

    oregon ha scritto:


    Prima di tutto, le linee che ci possono essere nel file, come sono ? Possono essere anche operazioni del tipo

    5 + 8 * 2 - 3 / 2

    ??
    Ciao no c'è una singola operazione, da effettuare, su ogni riga del file. Quindi no il caso da te proposto non si può verificare.
  • Re: Problema esegui operazioni lette da file

    Ok quindi è semplice... Ma dove trovi problemi / errori ?
  • Re: Problema esegui operazioni lette da file

    oregon ha scritto:


    Ok quindi è semplice... Ma dove trovi problemi / errori ?
    Allora la funzione che fa le somme non funziona molto bene perché quando mi calcolo la grandezza con strlen () non mi da la grandezza effettiva dell'array ma 3 numeri in più tranne che sull' ultimo livello dell'array che mi da un solo nunero in più. Questo è un problema perché così la conversione del secondo numero avviene sbagliata, comunque in teoria potrei aggiustarlo calcolando in un altro for quanti numeri sono presenti dopo il segno, ma sinceramente non capisco perché con strlen mi da dei valori in più e poi l'algoritmo di base mi sembra sbagliato quindi volevo sapere se c'è un modo più semplice o più corretto di svolgere questo esercizio.

    Comunque ti ringrazio per la pazienza e la disponibilità.
  • Re: Problema esegui operazioni lette da file

    Non ho capito nulla.

    Prova a spiegarti con un esempio di riga in input e di elaborazione passo passo.
  • Re: Problema esegui operazioni lette da file

    Rzx ha scritto:


    oregon ha scritto:


    Ok quindi è semplice... Ma dove trovi problemi / errori ?
    Allora la funzione che fa le somme non funziona molto bene perché quando mi calcolo la grandezza con strlen () non mi da la grandezza effettiva dell'array ma 3 numeri in più tranne che sull' ultimo livello dell'array che mi da un solo nunero in più. Questo è un problema perché così la conversione del secondo numero avviene sbagliata, comunque in teoria potrei aggiustarlo calcolando in un altro for quanti numeri sono presenti dopo il segno, ma sinceramente non capisco perché con strlen mi da dei valori in più e poi l'algoritmo di base mi sembra sbagliato quindi volevo sapere se c'è un modo più semplice o più corretto di svolgere questo esercizio.

    Comunque ti ringrazio per la pazienza e la disponibilità.
    Da una rapida occhiata al codice vedo che leggi un carattere alla volta (a proposito, per fare così sarebbe più efficiente fgetc) ma alla fine non aggiungi il terminatore di stringa ('\0'). Inoltre lasci nella stringa anche l'accapo.
  • Re: Problema esegui operazioni lette da file

    Utilizza la fgets per ottenere direttamente tutta la stringa ...
  • Re: Problema esegui operazioni lette da file

    oregon ha scritto:


    Non ho capito nulla.

    Prova a spiegarti con un esempio di riga in input e di elaborazione passo passo.
    Ti posto il file di testo:
    " 3 + 9
    4 * 2
    123 - 27"

    Logicamente senza virgolette.
  • Re: Problema esegui operazioni lette da file

    dvaosta ha scritto:


    Da una rapida occhiata al codice vedo che leggi un carattere alla volta (a proposito, per fare così sarebbe più efficiente fgetc) ma alla fine non aggiungi il terminatore di stringa ('\0'). Inoltre lasci nella stringa anche l'accapo.
    Appena ho un attimo provo con fgetc e anche fgets.
  • Re: Problema esegui operazioni lette da file

    Potresti anche utilizzare la fscanf ... facci sapere
Devi accedere o registrarti per scrivere nel forum
10 risposte