ho bisogno di una piccola consulenza... sono alle prime armi con la programmazione in C.
dovrei e vorrei fare una funzione che risolve espressioni del tipo (((5+3)/2)-(4))+1) RICEVENDO un puntatore a carattere.
come posso fare??
ho provato a fare un abbozzo (credo più lungo del dovuto) ma mi va in BusError.
ecco il codice che ho provato io...
- Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
char trovacarattere(int num) // converto da intero a carettere
{ switch (num) {
case 0: return '0';
case 1: return '1';
case 2: return '2';
case 3: return '3';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return '7';
case 8: return '8';
case 9: return '9';
}
}
char* eseguicalcoli(char* input)
{
int i,j;
int n1,n2,n3;
char num;
char *flag;
*flag='0';
for (i=0; *(input+i)!='\0'; i++) //cerco un numero
{
if (*(input+i)>='0' && *(input+i)<='9') break;
}
if (*(input+i)==')' || *(input+i)=='(')
{
*(input+i-1)=*(input+i);
for(j=0;*(input+i+j)!='\0';j++) // elimino le parentesi nel caso (5)
*(input+i+j)=*(input+i+j+2);
eseguicalcoli(input+i);
}
if (*(input+i+1)>='0' && *(input+i+1)<='9')
{
n1=atoi(*(input+i-1)); // converto i caratteri in numeri
n2=atoi(*(input+i+1));
switch (*(input+i)) { // eseguo le operazioni
case '+': n3=n1+n2; break;
case '-': n3=n1-n2; break;
case '*': n3=n1*n2; break;
case '/': n3=n1/n2; break;
default: break;
}
num=trovacarattere(n3);
*(input+i-1)=num; // metto il carattere al posto dell'espressione
for(j=0;*(input+i+j)!='\0';j++) // elimino le parentesi nel caso (5+3)
*(input+i+j)=*(input+i+j+3);
eseguicalcoli(input+i);
}
return input;
}
int calcolo(char* input){
return atoi(eseguicalcoli(input));
}
int main()
{
char *espressione;
int risultato;
printf("Dammi un'espressione, ignorante...\n");
scanf("%s",espressione);
risultato=calcolo(espressione);
printf("Risultato=%i",&risultato);
}
Ovviamente se trovate codici più efficienti dite pure...
NB. la funzione atoi permette di trasformare un carattere nel corrispettivo intero.