我要求用户输入一个将以后缀表示法计算的表达式。表达式的开头是将存储计算表达式的答案的变量名称。例如: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,然后当我输入第二个表达式 B A 10 * 35.50 + = 时,它的计算结果必须为 1565.5 ,但事实并非如此。它评估为 35.5。我不明白为什么我得到错误的答案。另外,我需要有关 OUT 语句的帮助。
最佳答案
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]
。
考虑使用 isdigit
而不是 expr1[i] >= '0' && expr1[i] <= '9'
测试您的代码中是否有一行中有多个空格或运算符后有一个空格的表达式。看起来您将重新添加您解析的最后一个数字。
测试像 123a456 这样的输入。您可能不喜欢这个结果。
如果在表达式协议(protocol)中指定了表达式中每个标记后的空格,将您的输入字符串放入字符串流中将允许您删除大量解析代码。
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
}
}
}
关于c++ - 如何在另一个输入语句中使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30205778/