|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
|
[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!! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2006
Città: Perugia - San Benedetto del Tronto
Messaggi: 341
|
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 ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2001
Città: Lecce
Messaggi: 3936
|
ti consiglio di inziare a studiare come funzionare un parser ed in particolare le espressioni regolari
|
![]() |
![]() |
![]() |
#4 |
Messaggi: n/a
|
Su CodeProject trovi diversi esempi di parser scritti in C#.
|
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
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)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
|
grazie a tutti per le risposte! ora mi vedo cosè un parser
![]() Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Non t'è bastata la condanna al rogo nel contest 17? Io svilupperei un piccolo parser a discesa ricorsiva basato su questa grammatica: Codice:
expr: term { (+|-) term } term: factor { (*|/) factor } factor: [-] expon expon: atom [^ expon] atom: '(' expr ')' | number | ln '(' expr ')' | sqrt '(' expr ')' Per esempio, 2^3 significa "due elevato a 3"; 5^ln(10) significa "cinque elevato a logaritmo di dieci". |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Alleluja. Pensavo oramai fossi talmente preso dalla politica da dimenticare la nostra sezione preferita.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Quote:
Prova a leggere questa, la prima che ho trovato. http://blogs.crsw.com/spence/articles/1595.aspx
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:12.