0

我正在编写一个程序,它是一个计算器,你可以在其中输入总和,它会给你答案。那部分工作正常。我遇到的问题是取上一个总和的答案并用它进行计算。

喜欢:5 + 5 = 10 ans + 10 = 20

当我运行下面的代码时,它工作正常,一遍又一遍地进行正常计算。但是,当我输入例如。 ans*2它使用先前设置为operate和的值numB。因此,如果是:5 + 5并且我想使用该结果并将其乘以例如 2,它将执行以下操作: 10 + 5 = 15

这是我的代码:

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

有人可以帮我解决这个问题。为什么不operate更新numB

4

1 回答 1

0

我怀疑问题出在这句话上:

ss>>numA>>operate>>numB;

numA并且numB是 类型double。例如ans + 10,如果输入行是 ,则该语句将尝试numA从该输入的开头提取为双精度,这将失败,而不会消耗输入字符串的任何部分。因此,提取剩余值 (operatenumB) 不会为您提供预期值,因为在提取这些值时整个输入字符串仍有待解析。

ans一种方法是在读取输入行后立即检查大小写。然后您可以使上面的语句有条件,针对ans案例以不同的方式解析值。

另一种解决方案是您首先将numAand值提取到字符串变量中,然后在检查特殊情况numB后才将它们转换为双精度值。ans

于 2014-04-14T16:30:01.283 回答