#include "cpp_headers/fcpp.hh" #include // fuer strlen, Laenge eines C-Strings #define MAX(a,b) a > b ? a : b // gibt stets die groeßere zahl zurueck // Taschenrechner Stack mit aktuellem Index und Zahlenspeicher struct RechnerStack { int current = 0; // zeigt auf das erste leere Element, anfangs 0 int numbers[64]; // der Zahlenstack }; // initialisiere den Stack RechnerStack stack; // gibt das letzte Element zurück int pop() { // letztes Element ist eins vor dem ersten leeren int last = stack.numbers[stack.current-1]; // setze den alten Eintrag auf 0 stack.numbers[stack.current-1] = 0; // reduziere den Index um 1, aber falle nicht unter 0 stack.current = MAX(stack.current-1, 0); // gebe letztes Element zurueck return last; } // fuege ein Element dem Stack hinzu void push(int element) { stack.numbers[stack.current] = element; // setze letztes leeres auf neuen wert stack.current += 1; // erhöhe den aktuellen Index } int main(int argc, char* argv[]) { // Setzen Sie hier auf einen leeren Stack // fange kein Kommandozeilenargument ab if(argc < 2) { print("Eingabe für den Taschenrechner erwartet!"); return 1; } // arg enthaelt die als Eingabe von der Kommandozeile uebergebene Zeichenfolge char* arg = argv[1]; // Schleife, die die Zeichen der Eingabe nacheinander ablaeuft // strlen gibt die Anzahl der Zeichen in der Zeichenkette bool inNumber = false; // merkt, ob aktuell eine zahl eingelesen wird int digitCount = 0; // zaehlt die anzahl der ziffern for (int i = 0; i <= strlen(arg); i = i+1) { char zeichen = arg[i]; // aktuelles Zeichen // 48: 0, 49: 1, ..., 57: 9 in ASCII if (zeichen >= 48 && zeichen <= 57) { inNumber = true; // setze auf true, da gerade Zahl eingelesen wird digitCount += 1; push(zeichen - 48); // fuege die neue Ziffer dem stack hinzu } else if (inNumber) { // erstes Zeichen nach Ziffern, das keine Ziffer ist inNumber = false; int newNumber = 0; // summiere nun alle ziffern auf for (int i = 0; i < digitCount; i++) { // nehme ziffer vom stack und multipliziere sie mit der // richtigen Zehnerpotenz fuer diese Dezimalstelle newNumber += pop()*pow(10, i); } // fuege neue Zahl dem Stack hinzu push(newNumber); // setze Zifferzahl zurueck digitCount = 0; } if (zeichen == '+' || zeichen == '-' || zeichen == '*' || zeichen == '/') { // falls zeichen ein Rechenoperator if (stack.current < 2) { // nicht genug argumente im stack fuer den operator print("Invalid: Not enough arguments for operator!"); return 1; } // nehme die zwei letzten Argumente int b = pop(); // letztes Element int a = pop(); // vorletztes Element // und fuehre Operation auf a und b aus, je nach zeichen // und fuege sie dem stack hinzu if (zeichen == '+') { push(a+b); } else if (zeichen == '-') { push(a-b); } else if (zeichen == '*') { push(a*b); } else if (zeichen == '/') { push(a/b); } } } if (stack.current > 1) { // falls mehr als eine Zahl im Stack uebrig, // haben Operatoren gefehlt, werfe also Fehler print("Invalid: Not enough operators for argument"); return 1; } // drucke das Ergebnis aus (letztes Element auf dem Stack) print(pop()); }