Taschenrechner JavaFX

melaniemueller

Aktives Mitglied
Guten Abend zusammen,
ich benötige eben einen Denkanstoß bei meinem Taschenrechner Problem...
Der Taschenrechner soll so aussehen, dass jede Zahl ein Button ist, sowie auch +,-,/,* und =. Die geklickten Zahlen und Operatoren sollen in einem Feld angezeigt werden. Im selben Feld soll dann auch das Ergebnis stehen. Also man tippt z.B. auf die 5 und diese wird angezeigt, dann plus 3 und dann steht dort "5+3" wenn man nun "=" klickt erlischt die Eingabe und das Ergebnis erscheint im selben Label. Ich hab nun die Oberfläche im SceneBuilder erstellt und mit dem Controller begonnen, aber ich weiß nicht wie ich die Eingabe über die Buttons handhaben soll.
Ich war so weit, dass ich ein ActionEvent erstelle und nach einem Klick auf den Button ganz einfach mit setText die Zahl ins Label bekomme, aber dann brauch ich ja auch noch eine Methode die die Rechnung durchführt und die weiß welche Aufgabe denn nun gestellt wurde. Finde für die Rechnung nicht den richtigen Anfang, wer kann mir helfen?
 
Also der Ansatz, mit der GUI zu starten, ist meist nicht so gut. Aber das will ich nicht vertiefen.

Ich weiss nicht, wie Du das generell haben willst - das was Du bisher geschrieben hast, klang so, dass Du eine einfache Texteingabe haben willst und Du dann irgendwann bei dem "=" Knopf den Ausdruck auswerten willst.

Und da musst Du Dir dann überlegen, wie der Ausdruck aussehen kann. Du kannst einen Ausdruck zerlegen und z.B. in eine Baumstrucktur überführen.

Dabei gehst Du immer von links nach rechts durch den Ausdruck und dabei behandelst Du immer zuerst die unterste Priorität.

Nehmen wir einfach einmal nur die Punkt- und Strickrechnung an als erlaubte Operatoren.

Beispiel: 5 + 2 * 3 + 7

Die Unterste Priorität hat die Strichrechnungrechnung. Du gehst also hin und suchst von links nach der ersten Strichrechnung und bekommst dann einen Knoten Addition mit links "5" und rechts "3*4+7".

Und das ist dann ein Rekursiver Aufruf - für den Linken Teilbaum hat man direkt einen Zahlenknoten "5"

Rechts hat man das 2 * 3 + 7 - also wieder Strichrechnung zuerst auflösen:
2*3 und 7 hat man dann als Teilbäume.

Bei 2*3 hat man keine Strichrechnung. Also schaut man nach eine Punktrechnung und hat dann diesen Knoten.

Man hat also einen Baum wo erst ein + Knoten kommt, links dann 5 und rechts dann wieder ein + Knoten mit links der Multiplikation und rechts der 7. Also in "Funktionsschreibweise" etwas wie
add(5, add(multiply(2,3), 7))

Jeder Knoten hat eine Methode getValue oder calculate oder so. Und die kannst Du dann aufrufen.
calculate bei einem + Knoten ist ein links.calculate() + rechts.calculate(). Ebenso - * und /.
calculate bei einem Zahlenknoten gibt direkt die Zahl raus.

Das wäre ein einfacher Weg um so einen Ausdruck zu bearbeiten.
 
Hallo,

Taschenrechner hört sich erst einmal einfach an, ist es aber nicht unbedingt. Du suchst nach einem Expression Evaluator oder Parser. Nachfolgen ein paar Links zum Einlesen und Ausprobieren:


Du wirst bei der Umsetzung ganz schnell auf die Ungenauigkeit von Fließkommazahlen stoßen. Z.B.: 0.1 + 0.2 = 0.30000000000000004. Lustig wird es, wenn Winkelfunktionen ins Spiel kommen. Ich habe mit pdparsii gute Erfahrungen gemacht, da dieser mit BigDecimal arbeitet.

Gruß
T.
 
Hey, wenn wir hier schon Werbung fuer sowas machen, muss ich natuerlich auch EvalEx vorschlagen.



Wie schon @KonradN gemeint hat, ist die Frage wie du den Zustand von deinem Taschenrechner halten willst. Im simpelsten Fall haettest du im Controller einfach drei Felder, "Parameter1", "Parameter2" und "Operation". Das bedeutet du hast dann quasi eine Zustandsmaschine welche zuerst "Parameter1" befuellt, denn die "Operation" und dann wird "Parameter2" befuellt. Wenn dann "=" gedrueckt wird, rechnest du das eben simpelst aus. Um den aktuellen Zustand anzuzeigen haengst du einfach die drei Felder aneinander.

Der andere Ansatz waere dass du einfach den "Text" in dein Eingabefeld schreibst (oder im Controller sammelst) und dann versuchst diesen auszuwerten. Je nachdem was genau du willst sind beides eben unterschiedliche Ansaetze.

Bei ersterem kannst du leichter auf Fehler reagieren, weil du bereits beim druecken der Taste validieren kannst. Auszerdem musst du nie einen Ausdruck zerlegen oder verarbeiten koennen, weil du hast nur zwei Parameter. Bei zweitem ist der Benutzer nicht daran gebunden dass du alles implementierst, es muss einfach nur ein gueltiger Ausdruck eingeben worden sein. Auszerdem koennte man dann einfach direkt in das Eingabefeld eingeben, aber ich glaube das ist jetzt fuer die Uebung dann nicht relevant. Aber dabei muss man eben den Ausdruck korrekt auswerten.

Wenn du einen eigenen Parser implementieren willst fuer die Ausdruecke, waere das der Shunting Yard Algorithm. Ohne Sonderfaelle ist der auch recht schnell heruntergetippt und getestet, aber ist eben eine etwas andere Baustelle als da jetzt so einen kleinen Taschenrechner zu machen.
 
@melaniemueller
Wenn Du einen JavaFX Scientific Calculator haben willst, sag mir Bescheid. Problem is nur, dass es keine Dokumentation gibt, sondern nur 26 JFX sources + 1 CSS file
 

Anhänge

  • Calculator.jpg
    Calculator.jpg
    20,3 KB · Aufrufe: 4

Zurück
Oben