Java Taschenrechner mit mehreren Nummern und Operatoren?

2 Antworten

Die schwierigste Aufgabe daran ist die "Tokenisierung", also das Zerlegen der Eingabe in Operanden (Zahlen) und Operatoren (+, -, *, /).

Dafür gibt es verschiedene Ansätze. Einer sind reguläre Ausdrücke, die man als Entwickler sowieso einmal lernen sollte (auch wenn manche Leute der Meinung sind, das sei Anfängern gar nicht zumutbar). Bei so einer einfachen "Sprache" wie in deiner Aufgabe kann das relativ einfach ausfallen: z.B. kannst du erstmal alle Leerzeichen entfernen und dann auf Übergänge zwischen Zahlen und Buchstaben splitten lassen. Du kannst sowas mit Websites wie https://regex101.com/ auch gut erstmal außerhalb des Programms testen.

Alternativ kannst du das auch zu Fuß machen: du gehst Zeichen für Zeichen durch den String und entscheidest, was Zahl und was Operator ist. Das ist konzeptionell sehr einfach, aber wird dich doch einige Zeilen mehr kosten.

Profis verwenden für sowas übrigens eigene Parser-Generatoren wie ANTLR, mit denen auch sehr viel kompliziertere Ausdrücke gut abzubilden sind. Wäre hier aber übertrieben.

Hast du diese Trennung geschafft, ist der Rest dann sehr einfach: Zahlen-Strings in Zahlen umwandeln, und je nach Operator die gewünschte Rechenoperation ausführen.

Davidmuax 
Fragesteller
 07.11.2023, 12:21

Zu Fuß könnte ich mit einem For loop durch den String durchloopen. Wenn ich jetz aber habe "32+1-6" dann gehört ja 3 und 2 zusammen. Also 32.
Ich könnte mir mit der loop jede Zahl angucken und wenn ein Operator kommt dann mach ich left + right (vom operator aus)

1
Davidmuax 
Fragesteller
 07.11.2023, 13:21

Oder ich könnte einfach mit Regex alles rausfiltern und dann durch gehen

0

Auch wenn eval-Funktionen Sicherheitstechnisch Ihre Tücken haben, wenn es darum geht zur Laufzeit einzugebende mathematische Formlen auszuführen kommt man kaum daran vorbei:

Dabei solltest Du im Auge behalten , dass eval-Funkionen in der Lage sind jegliche Nutzereingaben zur Laufzeit auszuführen. Ggf. musst Du vor Ausführung eines Strings als Code per RegEx , etc. prüfen , dass dieser keine unzulässigen Befehle enthält.

Wenn Du das Programm lediglich für den Eigenbedarf verwendest, kannst natürlich auf derartige Sicherheitsvorkehrungen verzichten.

Technisch wird eine als String eingegebene mathematische Formel genau so ausgeführt, als hättest Du sie im Quellcode deines Programms eingegeben . Eval ist immer langsamer als compilierter Code, da er erst zur Laufzeit interpretiert/ JITcompiliert werden muss.

jo135  07.11.2023, 12:28

Jetzt mal von den Sicherheitsimplikationen abgesehen: moderne JDKs (ab 15) kommen nicht mehr mit einer JS-Runtime. Damit sind alle Lösungen, die das voraussetzen, so nicht mehr lauffähig.

1