PDA

View Full Version : Calcolatrice e parser


StErMiNeiToR
24-09-2004, 15:41
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

int main ()
{
char es [100];
char n [16];
int numeri [64];
char op [64];
int risultato = 0;
int i,c = 0, k = 0, j=0;
gets(es);
for ( i = 0; i < strlen ( es ); i++ )
{
if ( es[i] >= '0' && es[i] <= '9' )
{
n[c] = es [i];
c++;
}
else {
if ( c )
{

n[c] = '\0';
c = 0;
numeri[k] = atoi ( n );
k++;

}

if ( es[i] == '+' || es[i] == '-' || es[i] == '*' || es[i] == '/' )
{
op[j] = es[i];
j++;
}
}
}
if ( c )
{

n[c] = '\0';
c = 0;
numeri[k] = atoi ( n );
k++;
}
c = 0;
i = 0;
for (; i < j;)
{
for(; c < k; c++ )
{
switch( op[i] )
{
case '+':
if ( c == 0 ) risultato += ( numeri[c] + numeri[++c] );
else if ( c != 0 ) risultato += numeri[c];
i++;
break;
case '-':
if ( c == 0 ) risultato += ( numeri[c] - numeri[++c] );
else if ( c != 0 ) risultato -= numeri[c];
i++;
break;
case '*':
if ( c == 0 ) risultato += ( numeri[c] * numeri[++c] );
else if ( c != 0 ) risultato *= numeri[c];
i++;
break;
case '/':
if ( c == 0 ) risultato += ( numeri[c] / numeri[++c] );
else if ( c != 0 ) risultato /= numeri[c];
i++;
break;
default: {}
}
}
}
cout<<endl<<endl<<"Il risultato dell'espressione e': "<<risultato<<endl;

system ( "pause" );

return 0;
}

adesso il mio dubbio è... come faccio a mettere i controlli per le priorita dei * e / ?

end.is.forever
24-09-2004, 18:27
Devi perforza costruire un albero, dato che le operazioni con precedenza (non solo per quello, ma anche solo se volessi implementare le parentesi) non necessariamente si applicano su numeri, ma piu in generale su espressioni.

Nel tuo caso un' espressione può essere un numero oppure un'operazione, per cui puoi ottimizzare l'albero usando due tipi di nodi: il nodo numero e il nodo operazione.

Nella costruzione dell'albero poi ti basta implementare uno "split" della stringa (se non ce l'hai già) in un metodo con chiamata ricorsiva (ogni operatore può essere un numero oppure un' altra operazione, quindi altro split) che dia precedenza agli operatori che vuoi tu.

Questo è il metodo che uso di solito io, non so se ce ne siano di più semplici, però è abbastanza espandibile e riusabile
Ciao.

StErMiNeiToR
24-09-2004, 19:02
piccolo problemino... devo ancora studiarli pile alberi ecc ecc :D