我正在编写一个程序,这是一个计算器,你可以输入总和,它会给你答案。那部分工作正常。我遇到的问题是得到前一笔钱的答案并用它进行计算。
赞: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
没有更新?
答案 0 :(得分:0)
我怀疑问题在于这句话:
ss>>numA>>operate>>numB;
numA
和numB
属于double
类型。如果输入行是例如ans + 10
,那么该语句将尝试从此输入的开头提取numA
,这将失败,而不会消耗输入字符串的任何部分。因此,提取剩余的值(operate
和numB
)将不会给出预期的值,因为整个输入字符串在提取这些值时仍然需要解析。
一种方法是在读取输入行后立即检查ans
个案例。然后你可以使上面的语句成为条件语句,为ans
case解析不同的值。
另一个解决方案是,您首先将numA
和numB
值提取到字符串变量中,并在检查ans
特殊情况后仅将它们转换为双精度值。