Taschenrechner Frage

Dragon1234

Neues Mitglied
Guten Tag,

ich programmiere der Zeit einen Taschenrechner. Alls funktoniniert ich bin auch kein Anfänger sondern eher momentan etwas Ratlos und zwar zu meiner Frage: 5+5 ausrechnen zu lassen ist ja total einfach. So, ich möchte meinen Taschenrechner auf pimpen, dass er Aufgaben wie z.b 5+5-3 lösen kann. Ich habe aber einfach keine Richtige Idee wie ich dies umsetzen könnte. Ich möchte weder Code Bsp sondern einfach eine kleine Erklärung wie ich dies Umsetzen könnte.

Vielen dank :)
 

Saheeda

Top Contributor
Ich weiß nicht, ob meine Lösung so toll ist, aber ich habs so gemacht
Zahlen und Zeichen werden in separaten Listen gespeichert. Beim Berechnen werden die benötigten Elemente entnommen (und entfernt) und das Ergebnis wird wieder an der Stelle eingefügt, wo vorher die Operanden waren. Die Schleife läuft, bis die Zeichen-liste leer ist.
 

arilou

Bekanntes Mitglied
Mal etwas formaler:
Du möchtest ein Programm schreiben, das einen mathematischen Ausdruck auswertet.
Ein mathematischer Ausdruck ist ein "Wort" einer bestimmten Sprache.
Du solltest dir also zunächst Gedanken darüber machen, wie die formale Sprache "mathematischer Ausdruck" aufgebaut ist (du erstellst also eine formale Grammatik).
Dein erstes Problem ist dann das Wortproblem, für das du zunächst einen Tokenizer und dann einen
Parser für die Sprache brauchst.
Anschließend kannst du den vom Parser gelieferten Objektbaum dann semantisch abarbeiten.

Liest sich jetzt sehr formal, die einzelnen Schritte sind aber mitunter recht einfach.
Als Tokenizer kann man z.B. einfach java.util.StringTokenizer verwenden.

So hat dein "Taschenrechner" die Chance, ein richtig gutes und klar strukturiertes Programm zu werden.
Oder du versuchst es "händisch und intuitiv" hinzubekommen, ohne Vorplanung. Dann wird's derselbe Murks wie tausende andere "Taschenrechner-Versuche".
 
Zuletzt bearbeitet:

BuckRogers

Bekanntes Mitglied
Ich halte einen StringTokenizer für unsinnig, da die Reihenfolge der Delimiter vorgeschrieben ist. Ergo brauchst du für jeden Operanden einen eigenen StringTokenizer. Ergo hast du schonmal für eine simple Interpretation der Zeichen einen aufgeblähten Algorithmus.
Mein Vorschlag hingegen ist, dass du einfach aus dem String ein charArray machst und für jedes Zeichen prüfst ob es eine Zahl oder ein Operand ist. Merke dir den index bis zum nächsten Operanden, falls es einen gibt und nimm die vorigen Zeichen und caste sie in einen double. Du bekommst zwangsläufig Probleme beim interpretieren der Zeichenfolge, wenn z.B. mehrere Operanden aufeinander folgen. Hier könnte man schon bei der Benutzereingabe validieren oder den Algorithmus anpassen damit umzugehen, je nachdem wie es Sinn macht. Letztlich hängt es davon ab, wie komplex der Taschenrechner werden soll.

Grüße
 
Zuletzt bearbeitet:

Bug Fisher

Bekanntes Mitglied
Eine sehr schöne Möglichkeit ist auch das rechnen mit (umgekehrter) polnischer Notation (die ersten Taschenrechner funktionierten so :))
Damit sind verschiedene Klammerungen (Assoziationen) und auch Funktionen leicht umsetzbar mit Hilfe eines Stacks.
Um infix nach postfix zu transformieren gibt es den shunting yard Algorithmus.


Abstract syntax tree ist ein weiteres Stichwort diesbezüglich.
 

arilou

Bekanntes Mitglied
Ich halte einen StringTokenizer für unsinnig, da die Reihenfolge der Delimiter vorgeschrieben ist. Ergo brauchst du für jeden Operanden einen eigenen StringTokenizer. Ergo hast du schonmal für eine simple Interpretation der Zeichen einen aufgeblähten Algorithmus.
Mein Vorschlag hingegen ist, dass du einfach aus dem String ein charArray machst und für jedes Zeichen prüfst ob es eine Zahl oder ein Operand ist. Merke dir den index bis zum nächsten Operanden, falls es einen gibt und nimm die vorigen Zeichen und caste sie in einen double. Du bekommst zwangsläufig Probleme beim interpretieren der Zeichenfolge, wenn z.B. mehrere Operanden aufeinander folgen. Hier könnte man schon bei der Benutzereingabe validieren oder den Algorithmus anpassen damit umzugehen, je nachdem wie es Sinn macht. Letztlich hängt es davon ab, wie komplex der Taschenrechner werden soll.

Grüße
Quatsch.
a) Der StringTokenizer bekommt mitgegeben, dass er als Delimiter "+-*/()" verwenden soll, und dass ich die Delimiter ebenfalls als Tokens zurückgegeben haben möchte. Warum ich da "für jeden Operanden einen eigenen StringTokenizer" bräuchte, ist mir schleierhaft. Und dass "die Reihenfolge der Delimiter vorgeschrieben" sei - hä? Das ist dem StringTokenizer völlig egal. Und dem logischen Tokenizer auch noch, erst der Parser erkennt nicht-wohlgeformte Ausdrücke.
b) "aus dem String ein charArray machst und für jedes Zeichen prüfst ob es eine Zahl oder ein Operand ist" - genau auf diese Art und Weise wird der Taschenrechner MURKS. Und viel Spaß beim Wandeln von ".78e-3" via "einzelne chars" in eine Gleitkommazahl!
c) Es wird noch schwierig genug, z.B. zu erkennen, ob ein '-' (oder ein '+') als Operator(! nicht "Operand", das sind nämlich die Zahlenwerte...) gemeint ist, oder als Vorzeichen der nachfolgenden Zahl, oder vor einem 'e' das Vorzeichen des Exponent angibt. (Ggf. kann man 'e' als weiteren Delimiter zum StringTokenizer nehmen.)
d) Spätestens wenn auch Klammerung funktionieren soll, oder der Taschenrechner Punkt-vor-Strich beachten soll, ist diese von-links-nach-rechts-Rechnerei am Ende.

Der logische Tokenizer erzeugt eine Liste von Objekten der Klasse "LexicalToken", die z.B. Unterklassen hat "Operator" und "Zahlenwert". Er sollte auch das Problem lösen, dass '+' und '-' evtl. Vorzeichen sind.

Danach kommt der Parser, der aus der Liste eine Baumstruktur aufbaut:
Die Zahlenwerte sind die Blätter, und Operator-Wertigkeit (Punkt-vor-Strich) und Klammerung ordnen, welche Rechnung zuerst (nahe an den Blättern) und welche zuletzt (nah an der Wurzel) ausgeführt werden:

1 + 4.5 * 4 - 3 * (1 + 2.5 * 2)
Code:
1  4.5  4  3  1  2.5  2
 \    \ /  |  |    \ /
  \    *   |   \    *
   \  /    |     \ /
    +      |      +
     \     |     /
      \     \  /
       \     *
         \  /
          -
 
Zuletzt bearbeitet:

BuckRogers

Bekanntes Mitglied
Die Lösung mit dem charArray ist zugegebenrmaßen MURKS :D. Ein StringTokenizer ist trotzdem kein guter Ansatz, da er die Delimiter in vorgegebener Reihenfolge erwatet. Probiert es doch aus. Ich lasse mich gern eines Besseren belehren. Vielleicht irre ich mich, aber ich habe erst vorgestern an diesem Problem gearbeitet im Sinne einer kleinen Config-Datei für eine kleine App. Wenn z.B. "+-" gesetzt ist, dann wird nach jeden '+' ein '-' erwartet, ansonsten Exception. Aus einem String sollten mehrere Parameter in ein Array geladen werden. Wenn es jedoch nur ein Parameter war, welcher keiner Separierung durch ein als Delimiter angegebenes Komma bedarf, wurde ich unsanft aus dem Programm geworfen, da ein Komma unbedingt an dieser Stelle erfolgen sollte.
Btw... Sehr schöne Ausführung Arilou.

Grüße
 

AndiE

Top Contributor
Ich gehe mal in eine andere Richtung. Der "einfache Java-Taschenrechner" besteht für mich aus einem Fenster, in dem 2 Textfelder und 6 Knöpfe sind" +,-,x,/, = , C". Wenn ich das als MVC baue, dann ist doch die Frage, wie ich so Kettenrechnungen hinbekomme. Die Frage in diesem angenommenen Fall ist einerseits, was passieren muss, wenn die actionListener der Button feuern, und wie so der Taschenrechner arbeitet.Andereseits ist auch die Frage, wie die Modellklasse eine Klasse Zahl aussehen sollte, die etwa Methoden Wie Zahl. adddiere(double parameter) zuläßt.
 

BuckRogers

Bekanntes Mitglied
Ich würde vorschlagen dass du mit dem Controller anfängst, denn er wird Dreh- und Angelpunkt. Alles was passiert geht darüber. Schreibe am besten zu Anfang ein paar Tests in denen du verschiedene Strings übergibst, welche per GUI-Eingabe möglich sind. Dann kannst du dich daran machen Klassen und Methoden zu erstellen, welche diese Strings 'richitg' zerlegen. Danach brauchst du quasi nur noch die GUI machen und dafür sorgen dass richtig gerechnet wird.

Grüße
 

arilou

Bekanntes Mitglied
[...] Ein StringTokenizer ist trotzdem kein guter Ansatz, da er die Delimiter in vorgegebener Reihenfolge erwatet. Probiert es doch aus. Ich lasse mich gern eines Besseren belehren.
Bitteschön:
Java:
import java.util.StringTokenizer ;

public class StringSplit_exper
{
  public static void main( String[] args )
  {
    StringTokenizer st ;
    final String delimiter = "+-" ;
    final String t1 = "abc+-def-+efg+123-0" ;

    st = new StringTokenizer( t1 , delimiter , true ) ;
    while( st.hasMoreTokens() )
      System.out.println( "\"" + st.nextToken() + "\"" ) ;
    // end while
  }
}
Output:
Code:
"abc"
"+"
"-"
"def"
"-"
"+"
"efg"
"+"
"123"
"-"
"0"
delimiter getauscht zu "-+" ergibt:
Code:
"abc"
"+"
"-"
"def"
"-"
"+"
"efg"
"+"
"123"
"-"
"0"
Ich sehe keinerlei Abhängigkeit von der Reihenfolge der Zeichen in 'delimiter'.
 

BuckRogers

Bekanntes Mitglied
Super,

danke für den Beweis und das diese falsche Annahme von mir beseitigt ist. Habe nochmal nachgeschaut was eigentlich mein Problem war. Mein Algorithmus hat dierekt nach Tokens mit einer bestimmten Zeichenfolge gesucht. Fälschlicherweise nahm ich an das lag an den Delimiters.

Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
F Erste Schritte Frage zu simplem Taschenrechner(switch) Java Basics - Anfänger-Themen 16
A Anfänger Taschenrechner Frage Java Basics - Anfänger-Themen 14
J Grafischen Taschenrechner programmieren - Frage dazu Java Basics - Anfänger-Themen 12
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
J Taschenrechner mit mehr als 2 Zahlen. Java Basics - Anfänger-Themen 18
R Einfacher Taschenrechner mit Eclipse Java Basics - Anfänger-Themen 3
M Einfacher Taschenrechner Java Basics - Anfänger-Themen 2
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
Y Taschenrechner programmieren Java Basics - Anfänger-Themen 3
G Taschenrechner ergibt Fehler in if-Abfrage Java Basics - Anfänger-Themen 6
K Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an. Java Basics - Anfänger-Themen 8
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
W Taschenrechner mit Switch case Java Basics - Anfänger-Themen 4
W Taschenrechner Java Basics - Anfänger-Themen 11
A Taschenrechner mit Gui erstellen Java Basics - Anfänger-Themen 9
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
P Taschenrechner mit unendlich vielen Eingabemöglichkeiten Java Basics - Anfänger-Themen 1
V Erste Schritte Taschenrechner mit beliebig vielen Zahlen Java Basics - Anfänger-Themen 5
S Taschenrechner Java Basics - Anfänger-Themen 13
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
S Compiler-Fehler Basic- Taschenrechner/ Fehler Java Basics - Anfänger-Themen 8
S Basic- Taschenrechner? Java Basics - Anfänger-Themen 7
P Hilfe bei Java Taschenrechner Java Basics - Anfänger-Themen 25
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
S Taschenrechner hilfe! Java Basics - Anfänger-Themen 17
H Java Taschenrechner Java Basics - Anfänger-Themen 4
R Variablen Taschenrechner mit Komfortfunktionen Java Basics - Anfänger-Themen 2
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
M Java Taschenrechner (if-else) Java Basics - Anfänger-Themen 11
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
Q simpler Taschenrechner Java Basics - Anfänger-Themen 34
R Taschenrechner NullPointerException Java Basics - Anfänger-Themen 1
R Variablen Weitergehenderr Taschenrechner Java Basics - Anfänger-Themen 4
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
M Java Taschenrechner Programmieren Java Basics - Anfänger-Themen 12
P Erste Schritte Taschenrechner mit if-else Anweisung Java Basics - Anfänger-Themen 6
G Taschenrechner gibt nur 0.0 aus Java Basics - Anfänger-Themen 8
A Taschenrechner programmieren Java Basics - Anfänger-Themen 21
Z Java Taschenrechner Java Basics - Anfänger-Themen 6
J Kleiner Taschenrechner! Anfänger braucht Hilfe :( Java Basics - Anfänger-Themen 2
C Taschenrechner in Java Java Basics - Anfänger-Themen 6
J Erste Schritte Java CMD Taschenrechner mit Parametern! Java Basics - Anfänger-Themen 16
J Taschenrechner: Probleme Java Basics - Anfänger-Themen 5
E Taschenrechner problem! Ich komme nicht voran Java Basics - Anfänger-Themen 18
R Erste Schritte Taschenrechner mit Schleife Java Basics - Anfänger-Themen 24
Lord.Djerun (Taschenrechner Netbeans) Komma nur einmal schreiben & 0 ersetzen Java Basics - Anfänger-Themen 1
Z Taschenrechner - Additions/Substraktions/Multiplikations/Divionsketten! Java Basics - Anfänger-Themen 4
Z Sehr simpler Taschenrechner - Hilfe! Java Basics - Anfänger-Themen 10
Z Taschenrechner - Wie addiere,multipliziere und subtrahiere ich? Java Basics - Anfänger-Themen 6
D kleiner Taschenrechner mit switch fehlerhaft Java Basics - Anfänger-Themen 1
K Taschenrechner im GUI Java Basics - Anfänger-Themen 2
P Taschenrechner, operatoren Java Basics - Anfänger-Themen 4
D Simpler Taschenrechner Java Basics - Anfänger-Themen 6
R Erste Schritte Taschenrechner - Punkt-vor-Strich Rechnung Java Basics - Anfänger-Themen 1
S Operatoren Taschenrechner Ergebnis ausgeben Java Basics - Anfänger-Themen 7
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
J Taschenrechner Funktion Java Basics - Anfänger-Themen 18
M Taschenrechner fertigstellung Java Basics - Anfänger-Themen 1
N Methoden Taschenrechner Java Basics - Anfänger-Themen 2
F z = input.nextChar(); PROBLEM Taschenrechner Java Basics - Anfänger-Themen 7
J Scanner Taschenrechner? Java Basics - Anfänger-Themen 7
J Variablen Rechenzeichen und Zahlen verknüpfen für einen Taschenrechner Java Basics - Anfänger-Themen 17
B Klassen Java Taschenrechner mit Klassen und Methoden Java Basics - Anfänger-Themen 12
B Erste Schritte Brauche Hilfe bei einem Java-Taschenrechner Java Basics - Anfänger-Themen 11
R Methoden Taschenrechner Java Basics - Anfänger-Themen 4
P Taschenrechner , IF-Abfrage Java Basics - Anfänger-Themen 12
I Taschenrechner - Methoden implementieren Java Basics - Anfänger-Themen 5
I Java Starthilfe (Taschenrechner) Java Basics - Anfänger-Themen 7
J Taschenrechner Problemchen Java Basics - Anfänger-Themen 3
D Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 11
K taschenrechner - Fehler beim Kürzen eines Bruches finden Java Basics - Anfänger-Themen 20
J Taschenrechner Punkt vor Strich Java Basics - Anfänger-Themen 9
A Taschenrechner programmieren Java Basics - Anfänger-Themen 5
M Ausklappbares Fenster bei grafischem Taschenrechner Java Basics - Anfänger-Themen 2
M Dividieren bei Grafischem Taschenrechner klappt nicht Java Basics - Anfänger-Themen 2
N Taschenrechner mit Unterprogra Java Basics - Anfänger-Themen 6
C Taschenrechner Java Basics - Anfänger-Themen 12
Z Taschenrechner programmieren Java Basics - Anfänger-Themen 5
E Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 8
K Taschenrechner Java Basics - Anfänger-Themen 25
J Textfeld für Taschenrechner Java Basics - Anfänger-Themen 3
D Taschenrechner Java Basics - Anfänger-Themen 28
A Taschenrechner-GUI mit BorderLayout? Java Basics - Anfänger-Themen 6
W [PROJEKT] Simpler grafischer Taschenrechner Java Basics - Anfänger-Themen 8
M Taschenrechner mit JApplet Java Basics - Anfänger-Themen 26
W Taschenrechner Java Basics - Anfänger-Themen 2
T Tasten vom Taschenrechner? Java Basics - Anfänger-Themen 3
S Datentypen Taschenrechner Java Basics - Anfänger-Themen 13
J Taschenrechner Java Basics - Anfänger-Themen 5
J Taschenrechner Java Basics - Anfänger-Themen 9
M While bei einem Taschenrechner Java Basics - Anfänger-Themen 5
F Datentypen Ganz simpler Taschenrechner mit switch Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben