PDA

View Full Version : [JAVA] Conversione stringa con operazione aritmetica a valore


Attila7894
26-08-2009, 21:35
Salve a tutti :) A scopo didattico, sto programmando una calcolatrice in Java con interfaccia grafica. Ho una TextField txt con un'operazione aritmetica, vorrei dare il valore alla pressione di un tasto, ma essendo String devo ovviamente convertirla prima in qualche modo. Ho provato così

Calculator.txt.setText(String.valueOf(Double.valueOf((Calculator.txt.getText()))));

Ma dà un'infinità di errori ed eccezioni :mc: Consigli?

isAlreadyInUse
26-08-2009, 21:40
Calculator.txt.setText(String.valueOf(Double.valueOf((Calculator.txt.getText()))));

Stai assegnando a txt il valore di se stesso con inutili conversioni

PGI-Bis
26-08-2009, 21:40
La conversione è ok: valueOf restituisce effettivamente un double data una stringa che lo rapprenta.

Che errori ti da?

Attila7894
26-08-2009, 21:51
Calculator.txt.setText(String.valueOf(Double.valueOf((Calculator.txt.getText()))));

Stai assegnando a txt il valore di se stesso con inutili conversioni

In realtà no, perchè in questo momento txt ha come text, ad esempio

4 + 5 - 9

quindi credevo che facendo quelle conversioni uscisse il valore dell'operazione. Lo sterr dà questo

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1 + 1"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.valueOf(Unknown Source)
at Calculator.ActionListenerEquals.actionPerformed(ActionListenerEquals.java:9)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

isAlreadyInUse
26-08-2009, 21:54
E no, devi prima eseguire l'operazioni e poi scrivi il risultato in txt

Attila7894
26-08-2009, 21:56
E no, devi prima eseguire l'operazioni e poi scrivi il risultato in txt

Il quesito è questo, come faccio a risolvere l'operazione se è contenuta in una stringa?

PGI-Bis
26-08-2009, 22:08
Devi prendere la stringa, separarla nelle diverse parti che compongono l'espressione e poi interpretare la successione di operandi e operatori per comporre il risultato.

Se non ti interessa il meccanismo di valutazione delle espressioni puoi usare uno script engine. Ad esempio:

import javax.script.*;

public class Main {

public static void main(String[] args) {
String expr = "1 + 10 - 24 * 2";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Object result = null;
try {
result = engine.eval(expr);
} catch(ScriptException ex) {
System.out.println("Errore nella valutazione di: " + expr);
ex.printStackTrace();
}
if(result instanceof Number) {
Number n = (Number)result;
System.out.println(n.doubleValue());
} else {
System.out.println("Che razza di espressione è?");
}
}
}

Qui l'espressione expr viene valutata dal motore javascript integrato in JavaSE.

Tieno conto che passare una stringa ad un motore di script senza alcun controllo è potenzialmente pericoloso (per "engine" non c'è differenza tra una stringa che fa una somma o una che richiede la cancellazione di un file).

Attila7894
26-08-2009, 22:13
Peccato, avevo pensate a spezzare la stringa con StringTokenizer, ma mi sembrava troppo macchinoso e speravo ci fosse qualche metodo di libreria che lo facesse per me :(

isAlreadyInUse
26-08-2009, 22:18
Si ma se stai facendo una calcolatrice a scopo didattico non ti conviene usare soluzioni gia pronte

Attila7894
26-08-2009, 22:24
Si ma se stai facendo una calcolatrice a scopo didattico non ti conviene usare soluzioni gia pronte

Infatti, quindi vorrei gentilmente sapere se è possibile risolvere la cosa in altro modo...

PGI-Bis
26-08-2009, 23:08
Ci sono tanti modi di farlo. Comunque devi separare la stringa in una successione di operandi e operatori. Per il calcolo puoi usare la RPN

http://it.wikipedia.org/wiki/Notazione_polacca_inversa

malocchio
27-08-2009, 02:46
Anch'io avevo scritto una calcolatrice che valutava un espressione aritmetica... mai finita davvero.
Comunque dietro a tutto è importante avere un buno progetto UML e la cosa si fa interessante.

Attila7894
27-08-2009, 02:50
Anch'io avevo scritto una calcolatrice che valutava un espressione aritmetica... mai finita davvero.
Comunque dietro a tutto è importante avere un buno progetto UML e la cosa si fa interessante.

Che intendi? :confused:

banryu79
27-08-2009, 09:42
@Attila7849
Se devi fare la calcolatrice per esercizio, sarebbe molto utile che non ti facessi fare i calcoli da una libreria, o come ti ha suggerito PGI dal motore di scripting ECMAScript (javascript) integrato nelle librerie del JDK di JavaSE.

Ciò comporta, per esempio, il doverti scrivere le classi che realizzano un analizzatore lessicale per le espressioni aritmetiche e un parser di precedenza degli operatori: molto formativo e interessante, ma senza una base di partenza e non conoscendo nulla degli argomenti mi rendo conto che sia molto dura.

Invece con delle buone informazioni alle spalle la cosa è fattibile e potrebbe essere molto didattica.
A tale scopo di linko due pagine del sito "Guide Algoritmi" (è pubblicato da un utente di questa sezione del forum) che potranno esserti molto utili secondo me.

La teoria è ben illustrata, e l'implementazione pratica (ci sono i sorgenti scaricabili) e gli stralci di codice d'esempio sono in linguaggio C: ma non dovrebbe essere difficile realizzare la cosa anche in Java.
I link:
- Analizzatore lessicale per espressioni aritmetiche (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=2)
- Operator Precedence Parsing: calcolare il valore di un'espressione aritmetica (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=3)

Attila7894
27-08-2009, 12:20
@Attila7849
Se devi fare la calcolatrice per esercizio, sarebbe molto utile che non ti facessi fare i calcoli da una libreria, o come ti ha suggerito PGI dal motore di scripting ECMAScript (javascript) integrato nelle librerie del JDK di JavaSE.

Ciò comporta, per esempio, il doverti scrivere le classi che realizzano un analizzatore lessicale per le espressioni aritmetiche e un parser di precedenza degli operatori: molto formativo e interessante, ma senza una base di partenza e non conoscendo nulla degli argomenti mi rendo conto che sia molto dura.

Invece con delle buone informazioni alle spalle la cosa è fattibile e potrebbe essere molto didattica.
A tale scopo di linko due pagine del sito "Guide Algoritmi" (è pubblicato da un utente di questa sezione del forum) che potranno esserti molto utili secondo me.

La teoria è ben illustrata, e l'implementazione pratica (ci sono i sorgenti scaricabili) e gli stralci di codice d'esempio sono in linguaggio C: ma non dovrebbe essere difficile realizzare la cosa anche in Java.
I link:
- Analizzatore lessicale per espressioni aritmetiche (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=2)
- Operator Precedence Parsing: calcolare il valore di un'espressione aritmetica (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=3)

Ti ringrazio per la risposta, leggo subito i link che mi hai proposto :)

Attila7894
27-08-2009, 15:03
Altro piccolo quesito, evito di aprire un nuovo topic.

E' necessario che io studi gli applet, se voglio creare giochi in java non per browser?

PGI-Bis
27-08-2009, 16:07
non è necessario. Non che ci sia molto da dire sugli applet.