|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Jul 2002
Città: Lucca
Messaggi: 965
|
Calcolatrice e parser
Codice:
#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; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 1578
|
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. |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Jul 2002
Città: Lucca
Messaggi: 965
|
piccolo problemino... devo ancora studiarli pile alberi ecc ecc
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:28.