 
View Full Version : [c#] analisi di una stringa per farla diventare un espressione matematica
ciao!
sto cercando di fare una calcolatrice scientifica in c# 
come posso analizzare una stringa del tipo
(ln(4) + sqrt(3))/ln(2)
e farla diventare un espressione "calcolabile dal mio programma"
tipo:
result= (ln(4) + sqrt(3))/ln(2);
grazie!!
:.Blizzard.:
08-02-2010, 23:26
Ho fatto proprio questa cosa in Java (in un contesto un poco pių complicato, considerando che dovevo disegnare funzioni).
Ho adottato la scelta di trasformare l'espressione immessa dall'utente in un'espressione in notazione polacca inversa :
http://it.wikipedia.org/wiki/Notazione_polacca_inversa
Cosė facendo potrai effettuare le operazioni necessarie in maniera sequenziale senza dover tener conto delle parentesi e delle varie funzioni composte.
L'algoritmo per trasformare una espressione dalla notazione infissa alla notazione postfissa si chiama Shunting Yard (Dijkstra).
http://en.wikipedia.org/wiki/Shunting-yard_algorithm
Devi realizzare anche un piccolo parser per lavorare con i token dell'espressione.
Questo ovviamente se vuoi fare le cose a mano. Non conosco il C# , magari ci sono strade molto pių facili. 
Spero comunque di esserti stato d'aiuto in qualche modo :D
DarkSiDE
09-02-2010, 15:06
ciao!
sto cercando di fare una calcolatrice scientifica in c# 
come posso analizzare una stringa del tipo
(ln(4) + sqrt(3))/ln(2)
e farla diventare un espressione "calcolabile dal mio programma"
tipo:
result= (ln(4) + sqrt(3))/ln(2);
grazie!!
ti consiglio di inziare a studiare come funzionare un parser ed in particolare le espressioni regolari
fdfdfdddd
09-02-2010, 15:17
Su CodeProject  (http://www.codeproject.com/) trovi diversi esempi di parser scritti in C#.
In C# puoi anche pensare di compilare l'espressione al volo ed ottenere il risultato (oppure eccezione se c'e' stato un problema)
Oppure puoi aprire un WebClient, navigare sulla pagina di google della calcolatrice, sottomettere la stringa e parsare il risultato. (per ridere)
grazie a tutti per le risposte! ora mi vedo cosč un parser :D 
In C# puoi anche pensare di compilare l'espressione al volo ed ottenere il risultato (oppure eccezione se c'e' stato un problema)
mi interessa molto sta cosa! anche perchč il mio era un primo passo per arrivare a qualcosa di pių avanzato... pensavo a una sorta di interprete per script su windows mobile ;)
Vincenzo1968
09-02-2010, 17:16
In C# puoi anche pensare di compilare l'espressione al volo ed ottenere il risultato (oppure eccezione se c'e' stato un problema)
Oppure puoi aprire un WebClient, navigare sulla pagina di google della calcolatrice, sottomettere la stringa e parsare il risultato. (per ridere)
Che mi venga un colpo!
Non t'č bastata la condanna al rogo nel contest 17 (http://www.hwupgrade.it/forum/showthread.php?p=28527264#post28527264)?
Io svilupperei un piccolo parser a discesa ricorsiva basato su questa grammatica:
expr:	term { (+|-) term }
term:	factor { (*|/) factor }
factor:	[-] expon
expon:	atom [^ expon]
atom:	'(' expr ')' 
	| number
        | ln '(' expr ')'
        | sqrt '(' expr ')'
Il simbolo '^' indica l'operatore di elevamento a potenza.
Per esempio, 2^3 significa "due elevato a 3"; 5^ln(10) significa "cinque elevato a logaritmo di dieci".
Alleluja. Pensavo oramai fossi talmente preso dalla politica da dimenticare la nostra sezione preferita.
grazie a tutti per le risposte! ora mi vedo cosč un parser :D 
mi interessa molto sta cosa! anche perchč il mio era un primo passo per arrivare a qualcosa di pių avanzato... pensavo a una sorta di interprete per script su windows mobile ;)
Ci sono tante risorse online.
Prova a leggere questa, la prima che ho trovato.
http://blogs.crsw.com/spence/articles/1595.aspx
Vincenzo1968
09-02-2010, 17:33
Alleluja. Pensavo oramai fossi talmente preso dalla politica da dimenticare la nostra sezione preferita.
:asd:
No no, vi leggo sempre. Passo sempre da qui prima di entrare in SPA.
Comincia a prepararti per il contest 18: DBMS.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.