|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2123
|
[C++]Espressioni algebriche
Come posso far parserare e risolvere expressioni alebriche come:
5 * (3a + 4a) + 4a * (x+1)(x-1) Tnk
__________________
Gnu/Linux User ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Esistono strumenti di parsing già pronti...anche se ora non mi ricordo il nome...
Il parsing è abbastanza semplice... Solitamente si scorre la stringa e si costruisce un albero di derivazione....in base a questo albero valuteremo poi l'espressione... La scansione della stringa si fa semplicemente carattere per carattere... In una situazione come quella sono determinanti per le suddivisoni degli operatori gli spazi, le parentesi e le operazioni aritmetiche... Quindi la prima cosa da fare è cercare un termine fra quelli riconosciuti... Leggo un carattere: 5 Leggo un altro carattere fino a quando trovo qualsiasi carattere diverso da un numero o dal "."... Trovo " " L'albero è composto esclusivamente dal 5... Cerco un operatore... "*" è un operatore... L'albero è composto da: Codice:
* |-- 5 |-- parametro da trovare "(" indica che l'intero albero che troverò fino alla corrispondente ")" va messo come figlio dell'operatore precedente... Trovo 3... Trovo a...allora a non è un numero, ma non è un operatore...sottointendo 3a come 3 * a... Creo il sottoalbero: Codice:
* |-- 3 |-- a Codice:
+ |-- * | |-- 3 | |-- a |-- parametro da trovare Codice:
+ |-- * | |-- 3 | |-- a |-- * |-- 4 |-- a Codice:
* |-- 5 |-- + |-- * | |-- 3 | |-- a |-- * |-- 4 |-- a L'operazione di parsing si fa solitamente con una fuzione ricorsiva che costruisce i vari sottoalberi... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2123
|
era + o - la soluzione che pensavo
![]() Quindi poi alla fine mi ciappo tutto faccio le operazioni e ricompongo la string con il risultato, giusto??? Direi che è un buon esercizio per vedere se il Sedgewick(x alberi) è servito a qualcosa ![]() Tnk cionci
__________________
Gnu/Linux User ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
ma perchè quando studi qualcosa di nuovo non ti preoccupi di fare qualche test per vedere se hai capito?
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
L'unica cosa su cui devi stare attento è la precedenza fra gli operatori...
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2123
|
Quote:
![]()
__________________
Gnu/Linux User ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:04.