Einen einfachen Taschenrechner programmieren

Berechnung von Termen in Polnischer Notation

Liegt der zu berechnende Term nun einmal in polnischer Notation (Postfix Schreibweise) vor, ist die Berechnung denkbar einfach. Von links nach rechts werden die Elemente abgearbeitet.

// Hilfs- und Ergebnisstapel
var stack = new Array();

// Hauptschleife, die so lange ausgeführt wird, wie Elemente im Postfix Array vorhanden sind
while (postfix.length) {
    // erstes Element des Postfix Stapels ziehen und je nach Fall auswerten
    switch (element = postfix.shift()) {
        case ':':
            // Division
            b = stack.pop();
            stack.push(stack.pop() / b);
            break;
        case '*':
            // Multiplikation
            stack.push(stack.pop() * stack.pop());
            break;
        case '+':
            // Addition
            stack.push(stack.pop() + stack.pop());
            break;
        case '-':
            // Subtraktion
            b = stack.pop();
            stack.push(stack.pop() - b);
            break;
        default:
            // Annahme, dass es sich nun nur noch um eine Zahl handeln kann
            stack.push(element);
    }
}

// Das Ergebnis der Berechnung liegt nun oben auf dem Hilfsstapel
var ergebnis = stack.pop();

Dieser extrem überschaubare (und damit billig zu produzierende) Code ist auch der Grund, warum viele preiswerte Taschenrechner Punkt-vor-Strichrechnung nicht beherrschen. In dieser Form hat der Taschenrechner allerdings auch noch Probleme mit negativen Zahlen. -1+1 oder 1cdot(-1) kann er nicht sauber berechnen.

Erläuterungen zum Programmcode

  • Zeilen 10 und 23: push() legt ein Element oben auf einen Stapel. Die Funktion pop() nimmt entsprechend das oberste Element vom Stapel und entfernt es aus dem Array. Da bei der Abarbeitung des Terms von links nach rechts vorgegangen wird, landet der rechte Operator entsprechend auch oben auf dem Stapel, der linke direkt darunter. Während die Reihenfolge der Zahlen bei Multiplikationen und Additionen unkritisch ist, ist diese bei der Subtraktion und Division entscheidend (1-2 != 2-1, bzw. 1:2 != 2:1). Aus diesem Grund müssen die Werte in Variablen zwischengespeichert werden um sie in die richtige Reihenfolge zu bringen.
  • Zeile 28: Es wird davon ausgegangen, dass durch die Erstellung des Postfix Arrays bereits ungültige Werte abgefangen wurden. Daher wird hier auf eine gesonderte Prüfung verzichtet und alles, was nicht einer der vier Operatoren ist, als Zahl verstanden.

Nach der allgemeinen Theorie und Fingerübung bringe ich dem Taschenrechner im nächsten Beitrag nun auf einfache Weise noch die Rechenregeln und das Verständnis von negativen sowie reellen Zahlen bei.

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.