Newsgroup: it.comp.lang.c
Titolo: Aiuto funzione matematica

Ciao,
studio ingegneria. Devo scrivere un programma che analizza diverse
funzioni per calcolarne il risultato. Non so però come acquisire le
funzioni dalla tastiera. Mi è stato consigliato da un collega di usare
un parser, ma non so cosa sia, come si scriva e come si utilizzi.
Qualcuno mi sa dare altre informazioni?
Grazie 1000

Se devi scrivere un parser ti consiglio di usare un generatore di
parser come Bison che puoi trovare a questo indirizzo
http://www.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsn125b.zip
la documentazione e' contenuta nel file bsn125d.zip e contiene un
esempio di calcolatrice simbolica che valuta anche funzioni.
Spero ti sia utile!
Ciao
RSte
rste79...@hotmail.com

 Grazie 1000
Se ho capito bene tu vuoi fare qualcosa di analogo a Derive.. il mitico
programma di matematica di qualche anno addietro.
Il parser ti serve per tradurre da stringa di caratteri in funzione, ovvero
per far capire al programma che diavolo di funzione hai usato. Sinceramente
non so dove tu possa trovarloe tantomeno dove trovarlo gratis.. forse
qualcuno ha scritto qualche classe precompilata che legge le strignhe e le
traduce ma non saprei dirtelo.
In alternativa costruisci il tuo parser impiegando leggi opportune per la
scrittura delle funzioni limitando i caratteri usabili, a quel punto
dovresti poter implementare il tuo parser in modo non troppo difficile
(anche se molto lungo in termini di codice).
Ad esempio potresti ricercare le parentesi all'interno della stringa in
ingresso, poi i numeri e le lettere (che formeranno parole tipo "sin" o
"arctan") se ci pensi bene non ci sono poi cosě tante funzioni basilari da
riconoscere. Una volta capito l'input il resto dovrebbe venire da se
implementando un case (la maniera piů semplice ma anche piů lunga).
ciao.

 funzioni dalla tastiera. Mi è stato consigliato da un collega di usare


Grazie per la risposta, ma purtroppo questa soluzione non è adatta al mio
caso in quanto devo analizzare anche funzioni con radici, esponenti etc.
El Zorro ha scritto:


 caso in quanto devo analizzare anche funzioni con radici, esponenti etc.
Scusa ma allora non ho capito ...
mi vuoi dire che ti hanno chiesto di scrivere un programma che:
- legga una linea contenente diciamo roba del genere:
  y = cos( x )* x *sin( 1/x)
- interpreti i caratteri rilevando funzioni, variabili indipententi e
assegnameni ( comprenda il formalismo matematico )
- crei uno stack funzioni / operatori di tipo RPN ( notazione polacca
inversa ) in memoria
- ricalcoli y a comando
se é così in pratica ti hanno chiesto di scrivere un "bare bones" matlab ...
.... magari "per esercizio" ?
Una drastica semplificazione si ottiene se ti accontenti di scrivere un
programmino che implementi una calcolatrice RPN in questo modo:
supponi di voler calcolare
cos( x )* x *sin( 1/x)
inserirai:
x  ( valore numerico )
ENTER
ENTER
COS
X<>Y            ( scambia 2 registri dello stack )
ENTER
1/X
*
*
Se riesci a far riconoscere ed eseguire correttamente al PC questa sequenza
poi il passo successivo di automatizzare
la trasformazione da notazione algebrica in notazione polacca non dovrebbe
essere difficile.
Ti consiglio di usare un linguaggio ad oggetti ... ( il C++ o Ada ad
esempio )
Z


 Grazie 1000
Non mi e' chiara l' entita' del problema. se puoi fare un input
guidato a menu' non che' bisogno di parser, se pero' devi fare
un programma che ha come input una espressione con tanto di parentesi
per stabilire le priorita' e da questo input deve elaborare una sequenza
di esecuzione per produrre un risultato, allora le cose si fanno
complesse. Mi dispiace che a seguito di un crash di HD ho perso un
sorgente Pascal di parser delle 4 operaz. aritmetiche che avevo
fatto anni fa. era ricorsivo.
Puoi usare comunque un generatore di parser come yacc o bison, ma prima
devi definire la sintassi. La piu' semplice per le espressioni
matematiche
per me e' la polacca prefissa, come il LISP es. (+ 5 4) e si presta a
realizzazioni ricorsive, altrimenti la suffissa si presta a
realizzazioni
iterative che usano uno stack ed e' piu' apprezzata. bc di Unix e' un
frontenf
a dc che appunto usa questa sintassi. ogni input numerico viene inpilato
e ogni codice operativo fa POP di tutti gli operandi che gli occorrono,
produce risultato e di questo fa PUSH nello stack. Ovviamente se dall'
input
bisogna anche ricavare le priorita' di esecuzione allora devi anche
elab.
le parentesi.
Un parser che elabora espressioni scritte in regola infissa es: (5 + 3)
lo puoi realizzare con tre funzioni MUTUAMENTE RICORSIVE, ma poi ti con-
fiene non eseguire i calcoli, piuttosto usare uno stack  come detto
precedentemente anche per ottimizzare i calcoli. Hai scelto un bel
problema.
Non ho sotto mano alcun testo, ma so che devi realizzare funzione
che riconosce espressioni come operaz. tra termini,
funzione che riconosce termini come operaz. tra fattori e fattori come
simbolo terminali processabili o come espressione tra parentesi.
di soloto trovi le definizioni di sintassi in BNF (Bakus Naur Form)
espressione ::= termine | ...
termine ::= fattore | ...
fattore ::= (espressione) | ....
buon lavoro.