Taschenrechner in Java Programmieren?

Matze_P

Newbie
Registriert
Aug. 2009
Beiträge
4
Hallo,

wir müssen innerhalb des nächsten Semesters einen Taschenrechner in Java programmieren. Jetzt wollte ich euch mal fragen, ob ihr wisst ob es da fertige Klassen für das auflösen der Klammern und sowas gibt?
Ich habe schon mit der Math Klasse gearbeitet, habe da aber leider keine Funktionen zum Auflösen von Thermen und so gefunden. Gibts da eventuell noch größeren Klassen oder welche die noch mehr können?

Klar müsst ihr nich meine Aufgaben erledigen, aber ich dachte mir ich frag mal..vl weiß ja von euch schon jemand was.

Freue mich auf die antworten :)

Gruß Matze
 
Würde mal google anschmeissen. Da gibts doch tausende fertige Java Taschenrechner wo du dich von inspirieren lassen kannst.
 
Vielleicht ist ja das hier hilfreich für dich. Ansonsten bin ich mir sicher, dass da allgemein mit Hilfe der regex-Klassen einiges machbar ist.
 
Hallo, die Stichworte für die Suche heißen "Inverse Polnische Notation" (= IPN oder auch postfix-Notation genannt) und "Stack" bzw. "Keller". Wenn man einen Term in IPN beschreibt und einen Keller verwendet, kann man beliebige Rechenausdrücke korrekt berechnen. Es gibt ein paar Regeln, wann man etwas einkellert und wann man es wieder heraus holt.

Komplexes Beispiel: (3 ∗ a − 7) ∗ (4 + b) entspricht (((3, a)∗, 7)−, (4, b)+)∗

Einfacheres Beispiel:

5 + 3 in IPN: (5,3)+

- Der Ausdruck wird von links nach rechts gelesen.
- Operanden werden eingekellert. Klammern ebenso.

Keller: | 5 | 3 | + |

- Operatoren werden zusammen mit den letzten beiden Operanden ausgekellert.
- Das Ergebnis wird wieder auf den Stack getan.

Keller: | 8 |

Wenn man einen Operandenkeller und einen Keller für die Operatoren benutzt kann man sich die Umformung in IPN sparen.
 
Zuletzt bearbeitet:
sollte man nicht prefix nutzen? also is mir gerade beim überfliegen nur so in den kopf geschossen.. man programmiert doch +(5,3)
 
AppLeYArD schrieb:
sollte man nicht prefix nutzen?
Nein, denn die UPN ist viel simpler zu implementieren, da man dort alles nur in einen Stapelspeicher schreiben und den dann abarbeiten muss.
 
Ruheliebhaber hat ja eigentlich schon alles wichtige geschrieben, aber hier nochmal ausführlich wie ich die Aufgabe letztes Semester gelöst habe:

1. Aus dem Rechenterm einen Baum bauen (geht gut rekursiv).
Aus (5+3)*2 wird zum Beispiel:

............*.................
........../...\...............
........+.....2.............
......./..\...................
.....5.....3................

2. Baum in postorder Reihenfolge traversieren, daraus wird: 5,3,+,2,* (UPN)

3. UPN ausrechnen:
1) Stack anlegen.
2) Wiederhole:
- Erstes Element aus der UPN entfernen
- Ist es eine Zahl auf den Stack pushen
- Ist es ein Operator 2 Zahlen vom Stack entfernen (poppen) und den Operator auf diese anwenden, Ergebnis auf den Stack pushen.
- Ist nur noch eine Zahl auf dem Stack ist das das Endergebnis.


Geht auch ohne Baum, aber ich fand das ziemlich intuitiv und geht in Java objektorientiert sehr schön.

PS: Es gibt fertige Klassen (zum Beispiel auf meinem Rechner :D), aber das ist eigentlich ne sehr schöne Aufgabe zum selber lösen. ;)
 
Zuletzt bearbeitet:
Schau dir mal groovy an, damit kannst du das etwas auslagern.

Ansonsten wären JavaCC oder ANTLR interessant.
 
Könntest du mal näher erläutern, warum er sich dafür Groovy anschauen sollte? Und ANTLR wäre denke ich auch nicht angebracht, da er wahrscheinlich selbst nen Parser schreiben und nicht aus einer vorgegeben Grammatik einen generieren soll.

@Thread-Ersteller: Wie bereits erwähnt, solltest du dir UPN anschauen und versuchen, das mal zu programmieren. Ist eine sehr gute Übung und bringt dich auf jeden Fall weiter.
 
Zurück
Oben