为什么我的代码没有为表达式字符串计算正确的值?

时间:2019-05-17 05:53:32

标签: c++ string algorithm expression-trees arithmetic-expressions

在代码中,我使用表达式树"3 + 2.53 - 1.75",该树应返回3.78的结果。但是,它最终将字符串中的所有值相加并输出7.28。我在纸上多次浏览了该代码,试图查看在使用索引变量idistance_operator的for循环的每次迭代中发生了什么。据我了解,我找不到程序继续添加每个浮点值的原因。到'-'字符时,它应该减去下一个值。

distance_operator曾经是第一个操作符的偏移量,索引i将被旋转,这样我就可以使用该字符串的一部分并使用substr()函数对其进行计算。

    float total = (float)value(expression[0]);
    int distance_operator;

    for (i = 1; i < expression.size(); i++) {
        if (expression[i] == '+' || expression[i] == '-') {
            distance_operator = i + 1;
            while (expression[distance_operator] != '+' || expression[distance_operator] != '-') {
                distance_operator++;
                if (distance_operator == expression.size())
                    break;
            }
            if (expression[i] == '+')
                total += std::stof(expression.substr(i, distance_operator - i));
            else if(expression[i] == '-')
                total -= std::stof(expression.substr(i, distance_operator - i));

        }
    }

2 个答案:

答案 0 :(得分:5)

该代码几乎是正确的,但是存在“一对一”错误。

问题是,当找到-时,使用正确的子字符串将"- 1.75"解析为数字时会带有负值,基本上,您会减去否定您要使用的值。累积代码应为:

if (expression[i] == '+')
    total += std::stof(expression.substr(i+1, distance_operator-i-1));
else if(expression[i] == '-')
    total -= std::stof(expression.substr(i+1, distance_operator-i-1));

请注意,由于使用的是i+1,因此找到的表达式符号将被跳过。

答案 1 :(得分:1)

还请注意,此检查

while (expression[distance_operator] != '+' || expression[distance_operator] != '-')

将始终为真,因为事物总是不同于A或不同于B。正确的逻辑运算符为&&。