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