2016-03-22 16 views
1

Ich versuche, einen Postfix-Rechner zu programmieren, aber ich laufe weiter in zwei Ausgaben - zuerst: Wenn der Rechner ein Leerzeichen findet, wird es einfach sofort beendet Sekunde: wenn es einen Nicht-Operator trifft/Nicht-Ziffer (ie-z) zeigt die Fehlermeldung, die ich codiert habe, nicht an.Postfix Notation Rechner

int main() 
{ 

stack <int> calcStack; 
string exp; 
char ans; 
cout << "\nDo you want to use the calculator?" << endl; 
cin >> ans; 
while (ans == 'y') 
{ 
    cout << "\nEnter your exp" << endl; 
    cin >> exp; 
    for (int i = 0; i < exp.size(); i++) 
    { 
     if (isspace(exp[i])) 
     { 

     } 
     else if (isdigit(exp[i])) 
     { 
      int num = exp[i] - '0'; 
      calcStack.push(num); 
     } 
     else 
      doOp(exp[i], calcStack); 
    } 

    while (!calcStack.empty()) 
    { 
     calcStack.pop(); 
    } 

    cout << "\nDo you want to use the calculator again?" << endl; 
    cin >> ans; 
} 

system("pause"); 
return 0; 
} 

Dies ist der function--

void doOp(const char & e, stack <int>& myS) 
{ 

if (myS.size() == 2) 
{ 
    int num1, num2, answ; 
    num2 = myS.top(); 
    myS.pop(); 
    num1 = myS.top(); 
    myS.pop(); 
    if (e == '+') 
     answ = num1 + num2; 
    else if (e == '-') 
     answ = num1 - num2; 
    else if (e == '*') 
     answ = num1 * num2; 
    else if (e == '/') 
     answ = num1/num2; 
    else if (e == '%') 
     answ = num1 % num2; 
    else 
     cout << "\nError- Invalid operator" << endl; 

    cout << "\nCalculating..." << endl << answ << endl; 
    myS.push(answ); 
} 
else 
    cout << "\nInvalid stack size- too few, or too many" << endl; 
} 
+0

Wenn Sie den Debugger arbeitet, und jede Anweisung ausgeführt eins nach dem anderen, welche Aussage hat das Problem verursacht? –

+0

Beachten Sie, dass beim Lesen von Daten aus '' cin'' in ein '' std: string'' Objekt ein Leerzeichen als Trennung zwischen zwei Werten betrachtet wird. Siehe http://stackoverflow.com/questions/5838711/c-cin-input-with-spaces – BrainStone

+0

dies verursacht das Platzproblem-- 37 * 9 - so wird die 3 * 7 funktionieren, aber nicht die -9. Auch wenn ich versuche, 37 * n + zu sagen, anstatt mir einen ungültigen Ausdruck zu geben, heißt das ungültige Größe. –

Antwort

0

In Ihrer Hauptschleife, sind Sie Strings mit dem String-Extraktor liest gerade:

cin >> exp; 

der String-Extraktor Raum empfindlich ist. Sobald ein Leerzeichen in der Eingabe gefunden wird, stoppt das Lesen der Zeichenfolge und der Leerzeichen wird nicht in exp eingeschlossen.

Wenn Sie eine komplette Linie inklusive Leerzeichen erhalten möchten, sollten Sie sich entscheiden:

getline (cin, exp); 

Edit:

Das Problem, das Sie mit getline() erleben zum char Extraktion realted wird, wenn Sie fragen wenn der Benutzer den Rechner benutzen möchte. Die Eingabe y ist nicht ausreichend. Geben Sie yein und geben Sie ein. Nur der y wird in ans eingefügt, so dass getline() beginnt, eine leere Zeile zu lesen.

Um dies zu lösen, aktualisieren Sie Ihre ursprüngliche Eingabe:

cin >> ans;     // as before 
    cin.ignore (INT_MAX, '\n'); // add this to skip everything until newline included 

Hier ein online demo zeigt, dass es (einschließlich Fehlermeldung bei falschem Operator)

+0

Wenn ich diesen Ansatz versuche, überspringt der Compiler vollständig und erlaubt dem Benutzer, den Ausdruck einzugeben, und geht direkt zur While-Schleife-Prüfung. –

+0

Könnten Sie bitte den Ausdruck angeben, den Sie analysieren? – Christophe

+0

mit getline (cin, exp) Ich kann keinen Ausdruck eingeben. Die Ausgabe sagt: Bitte geben Sie einen Ausdruck ein: Dann fragt sie den Benutzer, ob sie den Taschenrechner verwenden möchten –