Frage

Ich schreibe ein Programm, bei dem es sich um einen Taschenrechner handelt, bei dem man die Summe eintippt und das Ergebnis erhält.Dieser Teil funktioniert gut.Das Problem, das ich habe, besteht darin, die Antwort der vorherigen Summe zu nehmen und damit eine Berechnung durchzuführen.

Wie: 5 + 5 = 10 ans + 10 = 20

Wenn ich den folgenden Code ausführe, funktioniert er einwandfrei, auch wenn ich normale Berechnungen immer wieder durchführe.Wenn ich jedoch z. B. tippe. ans*2 Es werden die zuvor eingestellten Werte verwendet operate Und numB.Wenn es also so wäre: 5 + 5 und ich möchte dieses Ergebnis verwenden und es mit z. B. 2 multiplizieren, es würde Folgendes bewirken:10 + 5 = 15

Hier ist mein Code:

#include <iostream>
#include <cmath>
#include <iomanip>
#include <sstream>
#include "bell.h"

using namespace std;

int main()
{
    stringstream ss;
    double numA;
    char operate;
    double numB;
    double ans=0;
    string temp;
    cout<<"input: ";

    getline(cin, temp);
    ss.str(temp);
    ss>>numA>>operate>>numB;

    cout<<setprecision(9);

    while(temp[0] != 'q' && temp[0] != 'Q')
    {
        if(temp[0]=='a' && temp[1]=='n' && temp[2]=='s')
        {
            numA=ans;
        }

        switch(operate)
        {
            case '+':
            {
                ans=numA+numB;
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }
            case '-':
            {
                ans=numA-numB;
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }
            case '*':
            {
                ans=numA*numB;
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }
            case '/':
            {
                ans=numA/numB;
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }
            case '^':
            {
                ans=pow(numA, numB);
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }
            case 'z':
            {
                ans=bell(numA, numB);
                cout<<numA<<" "<<operate<<" "<<numB <<" = "<< ans<<endl;
                break;
            }

            default:
            {
                cout<<"Invalid input. Please try again!"<<endl;
            }
        }
        ss.clear();
        ss.str(" ");
        cout<<"Input: ";
        getline(cin, temp);
        ss.str(temp);
        ss>>numA>>operate>>numB;
    }
    cout<<"Goodbye"<<endl;
    return 0;
}

Könnte mir bitte jemand helfen, das zum Laufen zu bringen?Warum tut operate Und numB nicht aktualisieren?

War es hilfreich?

Lösung

Ich vermute, dass das Problem in dieser Aussage liegt:

ss>>numA>>operate>>numB;

numA Und numB sind vom Typ double.Wenn die Eingabezeile z. B. lautet ans + 10, diese Anweisung wird versucht zu extrahieren numA als Double vom Anfang dieser Eingabe an, was fehlschlägt, ohne dass Teile Ihrer Eingabezeichenfolge verbraucht werden.Infolgedessen werden die verbleibenden Werte extrahiert (operate Und numB) liefert Ihnen nicht die erwarteten Werte, da beim Extrahieren dieser Werte noch die gesamte Eingabezeichenfolge analysiert werden muss.

Ein Ansatz besteht darin, dass Sie nach dem suchen ans Fall zuerst, unmittelbar nach dem Lesen der Eingabezeile.Dann können Sie die obige Anweisung bedingt machen und die Werte für die unterschiedlich analysieren ans Fall.

Eine andere Lösung besteht darin, dass Sie zuerst die Datei extrahieren numA Und numB Werte in String-Variablen umwandeln und sie erst dann in Doubles umwandeln, nachdem Sie dies überprüft haben ans besonderer Fall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top