PDA

Visualizza la versione completa : [c++]risolvere una semplice espressione


apatico
15-10-2004, 22:43
(1+1)+(2+2)=

voglio creare un programma che mi risolva questa semplice espressione,ma non so' come fare....................per favore aiutatemi....................................

Xadoom
15-10-2004, 22:50
inanzitutto fai una ricerca qui sul forum, se ne è parlato già più di una volta, l'ultima proprio ultimamente...cerca tipo "calcolatrice".
Ciao :ciauz:

apatico
15-10-2004, 23:02
nella discussione che mi hai indicato si parla di somme algebriche e io invece devo eseguire una semplice espressione.
se qualcuno mi potrebbe postare un'esempio..................

gandalf45
16-10-2004, 14:07
Temo non sia così semplice :( ... finche si tratta di una semplice somma la puoi gestire come nel thread che ti è stato consigliato.

Se invece vuoi proprio un lettore di espressioni il discorso si fa molto + complicato... devi creare un parser per "smontare" le stringhe con l'espressioni.

Xadoom
16-10-2004, 14:14
Originariamente inviato da apatico
nella discussione che mi hai indicato si parla di somme algebriche e io invece devo eseguire una semplice espressione.
se qualcuno mi potrebbe postare un'esempio..................
Ti ripeto che più volte se ne è parlato, ricordo anche di aver aiutato qualcuno qui sul forum che stava a buon punto, la sua "calcolatrice" valutava espressioni con somme,prodotti,logaritmi,radici,parentesi,...ecc.
Ora vedo se ritrovo il 3D.
:ciauz:

apatico
16-10-2004, 14:43
peerchè è cosi difficile?in fondo bisogna solamente dire al computer che di calcolare solo il risultato messo fra parentesi......................

unomichisiada
16-10-2004, 15:13
/* eval_expr.symbol */

int Plus(int a,int b)
{
return (a+b);
}

int Minus(int a,int b)
{
return (a-b);
}

int Divide(int a,int b)
{
return (a/b);
}

int Multiply(int a,int b)
{
return (a*b);
}

int Modulus(int a,int b)
{
return (a%b);
}

typedef struct _operand
{
char symbol;
int preced;
int (*funct)();
} Operand;


Operand operand [] =
{
{'+',1,Plus},
{'-',1,Minus},
{'/',2,Divide},
{'*',2,Multiply},
{'%',2,Modulus},
{0,0,0}
};

int FindLastOp(char *str,int preced)
{
int pos,i,numParent,retValue;

//valore di ritorno
retValue = -2;

//stato bilanciamento parentesi
numParent = 0;

//partiamo da fine stringa
pos = strlen(str)-1;

//per ogni carattere str[pos]
//fino ad arrivare all'inizio dell'espressione
while (pos>=0)
{
//teniamo conto delle parentesi incontrate
if (str[pos] == ')')
numParent ++;
if (str[pos] == '(')
numParent --;

i = 0;
//per tutti gli operatori definiti e finchè le
//parentesi non sono bilanciate
while (!numParent && operand[i].symbol)
{
//se il carattere corrente è un'operatore
if (operand[i].symbol == str[pos])
{
retValue = -1;
if (operand[i].preced == preced)
return (pos);
}
//prossimo operatore
i++;
}
//carattere successivo (o meglio precedente)
pos--;
}
return (retValue);
}

int is_nb(char *str)
{
if ( *str == '(' )
{
str[strlen(str)-1] = 0;
return (eval_expr_sub(str+1,0));
}
return (atoi(str));
}

int eval_expr_sub(char *str,int preced)
{
int pos;
char save;
int nb2;
if ((pos = FindLastOp(str,preced))==-1)
return (eval_expr_sub(str,preced+1));
if (pos==-2)
return (is_nb(str));
nb2 = eval_expr_sub(str+pos+1,preced+1);
save = str[pos];
str[pos] = 0;
pos = 0;
while (operand[pos].symbol)
{
if (save==operand[pos].symbol)
return (operand[pos].funct(eval_expr_sub(str,preced),nb2));
pos ++;
}
printf("PB !!!\n");
return (0);
}


int eval_expr(char *str)
{
return (eval_expr_sub(str, 0));
}

#include "eval_expr.c"
int main(int ac,char **av)
{
if (ac>1)
{
printf("%d\n", eval_expr(av[1]));
}
getchar();
}

gandalf45
16-10-2004, 19:21
Originariamente inviato da apatico
peerchè è cosi difficile?in fondo bisogna solamente dire al computer che di calcolare solo il risultato messo fra parentesi......................
3+88 se le espressioni sono tutte così è semplice

(3+(3*22))-55/(3+22) è molto + difficile e come divevo richiede un parser

Non ti voglio scoragiare :) è solo che se le espresioni possono variare ci vuole abbastanza codice per gestire i vari casi

SnakePlissken
16-10-2004, 20:33
Come ti hanno già detto non è una cosa così semplice, e se ne è parlato già varie volte.

In C guarda qui (http://forum.html.it/forum/showthread.php?s=&threadid=697860&highlight=parser) e qui (http://forum.html.it/forum/showthread.php?s=&threadid=715311&highlight=parser). C'è la versione semplice di base alla quale ci siamo rifatti io e unomichisiada, (che però l'ha resa più esplicativa, quindi studia questa sua, che ti ha già postato), c'è anche la mia versione (incompleta) che implementa funzioni.


Ma visto che lo vuoi in C++, qua ti indirizzano sulla strada OOP:
http://forum.html.it/forum/showthread.php?s=&threadid=602904&highlight=parser

E qui sembra che abbiano fatto qualcosa (in java):
http://forum.html.it/forum/showthread.php?s=&threadid=526259&highlight=parser


Alla fine ho fatto io la ricerca al posto tuo :dottò: !

:ciauz:

apatico
17-10-2004, 17:32
unomichisiada come dovrò impostare i cout nel codice???


SnakePlissken sono programmi in java che avevo già visto,io voglio un esempio da studiare in c++.

Loading