Почему мой код не вычисляет правильное значение для строки выражения? - PullRequest
6 голосов
/ 17 мая 2019

В коде я использую дерево выражений "3 + 2.53 - 1.75", которое должно возвращать результат 3.78. Тем не менее, он заканчивает тем, что добавляет все значения в строке и выводит 7.28. Я несколько раз просматривал код на бумаге, пытаясь понять, что происходит в каждой итерации цикла for, где также используются переменные индекса i и distance_operator. Насколько я прошел через это, я не могу найти причину, почему программа продолжает добавлять каждое значение с плавающей запятой. К тому времени, когда будет достигнут символ '-', он должен вычесть следующее значение.

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 ]

5 голосов
/ 17 мая 2019

Код почти правильный, но есть ошибка "off-by-one".

Проблема в том, что при поиске - правильная подстрока будет "- 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 голос
/ 17 мая 2019

Также обратите внимание, что этот чек

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

всегда будет истинным, потому что вещь всегда отличается от A ИЛИ отличается от B. Правильный логический оператор - &&.

...