UPN Taschenrechner (war: Extremnekromantie in 'upn taschenrechner')
-
#include <iostream> #include <math.h> #include <string> #include <sstream> #define anz 100 using namespace std; double stackrechner[anz]; double *stackpointer = stackrechner; enum Eingabe { CommandBeenden, CommandPrint, Operator, Operand, Error }; int CheckDoubleNumber(const string eingabe); bool isOperator(char op) { char ops[] = { '+', '-', '*', '/'}; for (int i = 0; i < 1; i++) { if (op == ops[i]) return true; } return false; } Eingabe CheckInputType(const string eingabe) { Eingabe status; if ((eingabe[0] == 'q' || eingabe[0] == 'Q' || eingabe[0] == 'x' || eingabe[0] == 'X') && (eingabe.length() == 1) ) { status = CommandBeenden; } else if ((eingabe[0] == 'p' || eingabe[0] == 'P') && (eingabe.length() == 1) ) { status = CommandPrint; } else if((eingabe[0] == '+' || eingabe[0] == '-' || eingabe[0] == '*' || eingabe[0] == '/') && (eingabe.length() == 1)) { status = Operator; } else if(CheckDoubleNumber(eingabe) == 2) { status = Operand; } else { status = Error; } return status; } int CheckDoubleNumber(const string eingabe) { enum meinEnum { start, Vorzeichen, Vorkomma, Komma, Nachkomma, Expot, Expotvz, Expotzahl }; meinEnum state; state = start; for (unsigned int i = 0; i < eingabe.length(); i++) { if (eingabe[i] == '\0') return 2; switch (state) { case start: if (eingabe[i] == '-' && (eingabe[i + 1] >= '0' && eingabe[i + 1] <= '9')) state = Vorzeichen; else if (eingabe[i] >= '0' && eingabe[i] <= '9') state = Vorkomma; else return 0; break; case Vorzeichen: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Vorkomma; } else { return 0; } break; case Vorkomma: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state =Vorkomma; } else { if (eingabe[i] == '.' || eingabe[i] == ',') { state = Komma; } else { if (eingabe[i] == 'e') { state = Expot; } else { return 0; // Falsch } } } break; case Komma: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Nachkomma; } else { return 0; // Falsch } break; case Nachkomma: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Nachkomma; } else if (eingabe[i] == 'e') { state = Expot; } else { return 0; // Falsch } break; case Expot: if (eingabe[i] == '-') { state = Expotvz; } else if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Expotzahl; } else { return 0; // Falsch } break; case Expotvz: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Expotzahl; } else { return 0; // Falsch } break; case Expotzahl: if (eingabe[i] >= '0' && eingabe[i] <= '9') { state = Expotzahl; } else { return 0; // Falsch } break; } } return 2; // Zahl } void stack_push(double y) { *stackpointer = y; stackpointer++; return; } double stack_pop() { double t; stackpointer--; t = *stackpointer; return t; } double stack_print(int zaehler) { double t; for (int i = 0; i < zaehler; i++) { stackpointer--; t = *stackpointer; cout << t << endl; } for (int i = 0; i < zaehler; i++) { stackpointer++; } } int main() { char eingabe[anz]; Eingabe abfrage; bool frage = true; int zaehler = 0; do { cout << "Eingabe: "; cin >> eingabe; abfrage = CheckInputType(eingabe); if (abfrage == Error) { cout << "Falsche Eingabe!" << endl; } else if (abfrage == Operator) { double erstevar = 0, zweitevar = 0, result; double f = stack_pop(); zweitevar = f; f = stack_pop(); erstevar = f; if (eingabe[0] == '-') { result = erstevar - zweitevar; } else if (eingabe[0] == '+') { result = erstevar + zweitevar; } else if (eingabe[0] == '*') { result = erstevar * zweitevar; } else if (eingabe[0] == '/') { result = erstevar / zweitevar; } stack_push(result); cout << stack_pop() << endl; *stackpointer++; zaehler-=1; } else if (abfrage == Operand) { zaehler+=1; stack_push(atof(eingabe)); } else if (abfrage == CommandPrint) { stack_print(zaehler); } else if (abfrage == CommandBeenden) { frage = false; } } while (frage == true); return 0; }
-
Wer ist für diese Impertinenz verantwortlich?
-
Arcoth schrieb:
Wer ist für diese Impertinenz verantwortlich?
Ich. Es war ein Random-Nekropost, der eine mögliche Lösung zu der Aufgabe im Titel darstellte (die bis zu dem Zeitpunkt in besagtem Thread fehlte, aber auch gar nicht gesucht war). Das gezeigte Programm ist durchaus diskussionswürdig (vor allem könnte man daraus lernen, wie es besser ginge!), daher wurde es abgetrennt vom unwichtigen Kontext des alten Threads.