如何在另一个输入语句中使用变量?

时间:2015-05-13 04:37:11

标签: c++ visual-c++

我要求用户输入一个表达式,该表达式将以后缀表示法进行评估。表达式的开头是变量名,其中将存储已计算表达式的答案。例如:A 4 5 * 6 + 2 * 1 - 6/4 2 + 3 * * =其中A是变量名,等号表示表达式的答案将存储在变量A中.OUT A语句表示存储在变量A中的数字将被打印出来。

我需要帮助的是,当我输入第二个表达式时,我得不到正确的答案。例如,我的第一个表达式A 4 5 * 6 + 2 * 1 - 6/4 2 + 3 * * =将评估为153,然后当我输入第二个表达式BA 10 * 35.50 + =时,它必须评估为1565.5 ,但事实并非如此。它的评估值为35.5。我无法弄清楚为什么我得到了错误的答案。另外,我需要OUT语句的帮助。

2 个答案:

答案 0 :(得分:1)

要在后续表达式中使用先前的符号名,请将其添加到解析循环中的if语句:

iscroll-probe.js

此外,您需要通过引用传递mapVars以在Eval调用中累积其内容:

else if (expr1[i] >= 'A' && expr1[i] <= 'Z')
{
    stackIt.push(mapVars1[expr[i]]);
}

对于输出(或任何)其他命令,我建议首先解析字符串前面的命令令牌。然后根据命令字符串调用不同的赋值器。在尝试将字符串作为算术赋值命令进行求值之后,您正试图立即检查OUT。你需要先做出这个选择。

答案 1 :(得分:1)

else if (isalpha(expr1[i]))
{
    stackIt.push(mapVars1[expr1[i]]);
}

将变量放置,如果尚未设置变量,则将其置零。

else if (isalpha(expr1[i]))
{
    map<char, double>::iterator found = mapVars1.find(expr1[i]);
    if (found != mapVars1.end())
    {
        stackIt.push(found->second);
    }
    else
    {
        // error message and exit loop
    }
}

可能更好。

其他建议:

编译器这些天非常尖锐,但你可能会从char cur = expr1[i];中稍微用一点,然后使用cur(或适当的描述性变量名)来代替循环中剩余的expr1[i]。< / p>

考虑使用isdigit代替expr1[i] >= '0' && expr1[i] <= '9'

在运算符之后的行或空格中使用多个空格的表达式测试代码。看起来您将重新添加您解析的最后一个数字。

测试123a456之类的输入。你可能不喜欢这个结果。

如果在表达式协议中指定了表达式中每个标记之后的空格,则将输入字符串放入字符串流将允许您删除大量的解析代码。

stringstream in(expr1);
string token;

while (in >> token)
{
    if (token == "+" || token == "-'" || ...)
    {
        // operator code
    }
    else if (token == "=")
    {
        // equals code
    }
    else if (mapVars1.find(token) != mapVars1.end())
    {
        // push variable
    }
    else if (token.length() > 0)
    {
        char * endp;
        double val = strtod(token.c_str(), &endp);
        if (*endp == '\0')
        {
            // push val
        }
    }
}