不能让它来更新变量C ++

时间:2014-04-14 15:59:24

标签: c++ stringstream sstream

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

赞:5 + 5 = 10 ans + 10 = 20

当我运行下面的代码时,它反复进行正常计算时工作正常。但是,当我输入例如。 ans*2它使用之前设置为operatenumB的值。所以,如果它是: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;
}

有人可以帮我解决这个问题。为什么operatenumB没有更新?

1 个答案:

答案 0 :(得分:0)

我怀疑问题在于这句话:

ss>>numA>>operate>>numB;

numAnumB属于double类型。如果输入行是例如ans + 10,那么该语句将尝试从此输入的开头提取numA,这将失败,而不会消耗输入字符串的任何部分。因此,提取剩余的值(operatenumB)将不会给出预期的值,因为整个输入字符串在提取这些值时仍然需要解析。

一种方法是在读取输入行后立即检查ans个案例。然后你可以使上面的语句成为条件语句,为ans case解析不同的值。

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

相关问题