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;
    }
    

  • Mod

    Wer ist für diese Impertinenz verantwortlich?


  • Mod

    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.


Log in to reply