Newsgroup: it.comp.lang.c
Titolo: Help!!! parsing espressioni matematiche!!!!!!

Ciao a tutti,
sono uno studente universitario di Roma iscritto a informatica bla bla
bla ....ma bando alle ciance.
Per lunedi 20 , devo consegnare un problema , risolto in C , che mi
permetta di valutare delle espressioni matematiche.
esempio:
x = 4 ;
y = 5 ;
z = ((x + 5)*2)+ y
il programma deve stampare 
z = 23
Per farlo , devo utilizzare una tavola hash per memorizzare i valori
costanti, e fino a qui nessun problema, penso.
il problema riguarda le espressioni : devo memorizzarle in un albero
tramite una funzione che mi "traduca" l'espressione in un albero e poi ,
tramite un altra funzione calcola, devo calcolare tutte le operazioni
dell 'albero. Per l'esempio precedente si crea :
                     +
                 *       5 (y)
             +       2
        4(x)     5
Come creare in maniera ricorsiva l'albero?
come calcolare l'albero??
Se volete divertirvi, adesso sapete cosa fare !! ...e vi ringrazierň
tantissimo!Altrimenti , grazie per la pazienza mostrata.
Chriss__
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Se volete divertirvi, adesso sapete cosa fare !! 
   Se volessi divertirmi, uscirei a farmi una birra... ;)
-- 
Alla prossima,
Marco

come calcolare l'albero??
L'albero non e' sbagliato? 4x dovrebbe venir spezzato in un
sottoalbero avente come radice il "per", a sinistra il 4 e a destra la
X.
Per calcolarlo puoi usare una visita in preordine (quella in cui
visiti prima i figli, potrei confondere il nome pero'), li memorizzi
in 2 variabili temporali e poi applicarci l'operatore del nodo padre.
chiamata_ricorsiva(root)
{
if (corrente != NULL) {
    if (corrente->tipo == operatore) {
        scegli_f_calcolo_corretta; /* uno switch per es- */
        return f_calcolo_corretta(
            chiamata_ricorsiva(corrente->left),
            chiamata_ricorsiva(corrente->right)
        );
    }
    else if (corrente->tipo == costante)
        return corrente->valore;
    else
        return hash_table(corrente->key) /*pesca valore dalla hash */
}
}
Per farla andare dovrai:
- implementarti un metodo per reperire un valore dalla hash data la
key
- implementare una un metodo per scegliere la funzione corretta da
applicare per il nodo
- riadattare il tutto alla struttura che usi (io ho ipotizzato
ragionevolmente un campo tipo per sapere cosa hai memorizzato, un
campo valore solo per le costanti e un campo key per prelevare dalla
hash)
- implementare un controllo degli errori di parsificazione (e' noioso,
fattelo tu :P).
Per leggere le espressioni io me le scriverei prima in polacca inversa
per togliermi tutti i fastidi sulla precedenza e poi da li ti crei
l'albero.
Se ne cerchi uno gia' fatto da cui prendere spunto ne aveva
implementato uno Andrea Laforgia ed e' open source (per sua stessa
ammissione ha qualche bug, ma mediamente si comporta bene): lo troci
nelle ACLib o un nome simile (si trovavano su volftp tempo fa', ora
non so).
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

Uhuhuh
io l'ho gia consegnato a guerrini da tempo
: )