|
|
|
@@ -0,0 +1,99 @@ |
|
|
|
#include "cpp_headers/fcpp.hh" |
|
|
|
#include <string.h> // 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()); |
|
|
|
} |