Einen einfachen Taschenrechner programmieren

Für die Überarbeitung meines Würfel Tools @RollButler wollte ich von einem in JavaScript eher schlampig programmierten Tool weg zu einem leistungsfähigerem Code wechseln. Bereits bei der JavaScript Version war die Würfel Anwendung auch als Taschenrechner nutzbar, allerdings nur als Seiteneffekt eines verwendeten Befehls, den ich persönlich für diesen Zweck eher unschön empfinde. Also war der Rückgriff auf längst verdrängtes Wissen aus meinem Studium der Informatik von vor 25 Jahren erforderlich. Ein wenig Recherche im Internet beschleunigte meine grauen Zellen, doch alle angebotenen Lösungen griffen entweder auf das “eval” Kommando zurück, oder ignorierten Punkt-vor-Strichrechnungen. Dabei ist die Lösung doch vergleichsweise einfach.

Im ersten Abschnitt gehe ich auf die Variante mit der eval-Funktion ein, bevor ich danach die bessere Option mit dem Umweg über die Polnischer Notation vorstelle und diese im zweiten Teil noch einmal verbessere.

Taschenrechner mit “eval()”

Persönlich finde ich Funktionen, denen man Code einer Programmiersprache übergibt, damit diese dann ausgeführt und das Ergebnis zurückgeliefert wird, hässlich, eines Informatikers unwürdig und nicht zuletzt höchst riskant. Riskant alleine schon aus dem Grund, dass ein potenzieller Angreifer in der Lage ist bei unsauberer Programmierung Kommandos ausführen zu lassen, die auf dem Server Schaden anrichten können. Was bei JavaScript eher unkritisch ist, da dieses zumeist auf dem PC des Nutzers selber ausgeführt wird, ist in anderen Umgebungen (PHP, Java, etc.) bedenklich.

Dennoch beginne ich hier mit der simpelsten Methode einen Taschenrechner zu programmieren. Wer anstelle der schnellen, lieber die saubere Variante sehen möchte, der kann diesen Abschnitt getrost überspringen.

Die Funktion eval() in JavaScript nimmt als Parameter einen String auf, wertet diesen aus, als sei es JavaScript Code und liefert das Ergebnis anschließend zurück.

var ergebnis = eval('1 + 1');

Nach Ausführung dieses Programmschnipsels ist in der Variablen “ergebnis” der Wert 2 gespeichert. Der Funktion eval() kann auch eine Variable mit dem gewünschten Befehl übergeben werden, was für die Zwecke der Implementierung eines Taschenrechners deutlich eleganter ist:

var aufgabe = '4 + 3 * 2';
var ergebnis = eval(aufgabe);

Die Variable “aufgabe” kann jede beliebige Anweisung im JavaScript Format aufnehmen. Für einen Taschenrechner muss also lediglich der vom Benutzer eingegebene Term in die Variable gespeichert und an die Funktion eval() durchgereicht werden.

<input type="text" id="aufgabe">
  <button onclick="rechnen();">Berechnen</button>
  <span id="ergebnis"></span>
<script>
function rechnen() {
 var aufgabe = document.getElementById('aufgabe').value;
 var ergebnis = eval(aufgabe);
 document.getElementById('ergebnis').innerHTML = 'Das Ergebnis von ' + aufgabe + ' lautet ' + ergebnis + '.';
}
</script>

Oder etwas kürzer

<input type="text" id="aufgabe">
<button onclick="javascript:document.getElementById('ergebnis').innerHTML = eval(document.getElementById('aufgabe').value);">Berechnen</button>
<span id="ergebnis"></span>

Der Vorteil dieser Lösung liegt auf der Hand: Sie ist einfach, deckt alle gängigen Rechenoperationen ab und berücksichtigt die Rechenregeln.

Allerdings kann hier auch anstelle eines mathematischen Terms ein anderer Code übergeben werden, z. B.

alert('Ich könnte auch Schadcode sein!')

Was wenig mit einer mathematischen Funktion zu tun hat.

Auch in PHP gibt es die eval() Funktion, die entsprechend der JavaScript Funktion Programmcode (allerdings in diesem Fall als PHP Code) aufnimmt und ausführt. Bei PHP rate ich allerdings von der Verwendung der eval() Funktion explizit für diesen Zweck ab, da PHP deutlich mächtiger im Funktionsumfang ist und auf diesem Wege durch einen Unbefugten auch die Festplatte gelöscht werden könnte.

eval("system('rm -rf /');");

Schreibe einen Kommentar

Nutze dieses Kommentarfeld um deine Meinung oder Ergänzung zu diesem Beitrag kundzutun. Verhalte dich bitte respektvoll und höflich! Kommentare werden vor der Veröffentlichung in der Regel moderiert und bei Verstößen gegen geltendes Recht, die guten Sitten, fehlendem Bezug oder missbräuchlicher Verwendung nicht freigegeben oder gelöscht.
Über die Angabe deines Namens, deiner E-Mail Adresse und deiner Webseite freuen wir uns, doch diese Felder sind optional. Deine E-Mail Adresse wird dabei zu keinem Zeitpunkt veröffentlicht.

Um mit dem Betreiber dieser Seite nicht-öffentlich in Kontakt zu treten, nutze die Möglichkeiten im Impressum.