【问题标题】:Postfix Notation Calculator后缀符号计算器
【发布时间】:2016-07-10 01:58:14
【问题描述】:

我正在尝试编写一个后缀计算器,但我一直遇到两个问题 - 第一:当计算器遇到空格时,它会立即退出 第二:当它遇到非运算符/非数字(即z)时,它不会显示我编码的错误消息。

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

这是函数--

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

【问题讨论】:

  • 当您使用调试器并一次执行每个语句时,哪个语句导致了问题?
  • 请记住,当您将数据从 cin 读取到 std:string 对象时,空格被视为两个值之间的分隔符。见stackoverflow.com/questions/5838711/c-cin-input-with-spaces
  • 这会导致空间问题 - 37* 9 - 所以 3*7 可以工作,但 -9 不行。此外,如果我尝试说 37*n+,而不是告诉我无效的表达式,它会说无效的大小。
  • 试过 getline (cin, exp)。它跳过所有内容并返回到 while 循环。还尝试了 cin.getline(exp, sizeof(exp))。编译器不会让我运行它。它给出了一个错误
  • 当我将 exp 转换为 char[100] 时,cin.getline 可以工作,但代码会因断言失败而退出。

标签: c++ calculator postfix-notation


【解决方案1】:

在您的主循环中,您正在使用字符串提取器读取字符串:

    cin >> exp;

字符串提取器对空间敏感。因此,只要在输入中遇到空格字符,字符串读取就会停止,并且 witespace 不包含在 exp 中。

如果你想得到一个包含空格的完整行,你应该选择:

    getline (cin, exp);  

编辑:

当您询问用户是否要使用计算器时,您遇到的getline() 问题与字符提取有关。输入y 是不够的。所以你将输入yenter。只有y 将被放入ans,因此getline() 将开始读取一个空行。

要解决这个问题,请更新您的初始输入:

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

这里有一个online demo 表明它可以工作(包括错误消息以防操作员错误)

【讨论】:

  • 当我尝试这种方法时,编译器完全跳过允许用户输入表达式,并直接进入 while 循环检查
  • 能否提供您正在解析的表达式?
  • 使用 getline (cin, exp) 我无法输入表达式。输出说:请输入一个表达式:然后询问用户是否要使用计算器
猜你喜欢
  • 2013-10-18
  • 2012-08-29
  • 2012-04-11
  • 2012-06-26
  • 2018-03-20
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多