Можешь помочь найти ошибку в моем коде?

Добрый день всем. У меня стоит задача разработать интерпретатор для "сферического скрипта в вакууме". Вот условия, которым он должен соответствовать:

— Используемые типы данных: int и float.  
— Все переменные должны быть глобальными и могут содержать как буквы, так и цифры в своих именах.  
— Поддерживаемые математические операции: +, -, *, / и ^ (возведение в степень).  
— Поддерживаемые математические функции: sqr(), sin(), cos().  
— Операторы сравнения: <, >, ==.  
— Конструкции языка: условные операторы if, if/else, циклы while, do/while и for, а также оператор break.

Однако у меня возникла проблема: значения переменных Y и Z не меняются при изменении значения X. Вот фрагмент кода, где это происходит:  

<pre><code class="cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;unordered_map&gt;
#include &lt;cmath&gt;
#include &lt;functional&gt;

using namespace std;

unordered_map&lt;string, double&gt; variables;

double eval_expr(const string&amp; expr) {
    string updated_expr = expr;
    for (const auto&amp; var : variables) {
        size_t pos = 0;
        while ((pos = updated_expr.find(var.first, pos)) != string::npos) {
            updated_expr.replace(pos, var.first.length(), to_string(var.second));
            pos += to_string(var.second).length();
        }
    }

    // Обработка sin и cos
    size_t pos = updated_expr.find("sin");
    while (pos != string::npos) {
        size_t start = updated_expr.find('(', pos) + 1;
        size_t end = updated_expr.find(')', start);
        double arg = eval_expr(updated_expr.substr(start, end - start));
        updated_expr.replace(pos, end - pos + 1, to_string(sin(arg)));
        pos = updated_expr.find("sin", pos);
    }

    pos = updated_expr.find("cos");
    while (pos != string::npos) {
        size_t start = updated_expr.find('(', pos);</code></pre>

Можете помочь выяснить, почему Y и Z не обновляются при изменении X?
  • 31 октября 2024 г. 12:22
Ответы на вопрос 2
Одна из возможных причин, почему ваши переменные Y и Z не обновляются при изменении значения X, связана с тем, как вы обрабатываете выражения. Если ваш код только выполняет одноразовую замену переменных в выражении, то он не будет повторно вычислять Y и Z на основе нового значения X.

Ваша функция `eval_expr` выполняет обработку выражения, но она не предполагает, что новое значение X может повлиять на Y и Z в их текущей формуле.

Решение состоит в следующем:

1. **Пересчет значений:** После того, как вы обновили значение переменной X, вам нужно выполнить пересчет значений Y и Z, если они зависят от X.

2. **Обработка зависимостей:** Вам нужно отслеживать, какие переменные зависят от других переменных и пересчитывать их каждый раз, когда они изменяются. 

Вот упрощенный пример, как это можно сделать:

```cpp
#include <iostream>
#include <string>
#include <unordered_map>
#include <cmath>

using namespace std;

unordered_map<string, double> variables;

void updateVariables() {
    // Например, если Y и Z зависят от X,
    // вы можете пересчитать их в зависимости от текущего X
    if (variables.find("X") != variables.end()) {
        variables["Y"] = variables["X"] * 2; // пример зависимости
        variables["Z"] = variables["X"] + 10; // пример зависимости
    }
}

double eval_expr(const string& expr) {
    // ваша логика для вычисления выражения
    // здесь вы также можете делать обновление переменных 

    // После вычисления выражения, если есть изменения в переменных:
    updateVariables();
  
    // вернем, например, значение X
    return variables["X"];
}

int main() {
    variables["X"] = 5;
    updateVariables(); // порой обновляем Y и Z
    cout << "Y: " << variables["Y"] << endl; // 10
    cout << "Z: " << variables["Z"] << endl; // 15

    variables["X"] = 10; // изменяем X
    updateVariables(); // обновляем Y и Z
    cout << "Y: " << variables["Y"] << endl; // 20
    cout << "Z: " << variables["Z"] << endl; // 20

    return 0;
}
```

Обратите внимание, что эта логика обновления переменных (в функции `updateVariables`) должна учитывать зависимости более сложных выражений. В зависимости от вашей реализации, вам может потребоваться более гибкий механизм для отслеживания, какие переменные зависят от каких. 

Также настоятельно рекомендуется тщательно протестировать код, чтобы убедиться, что все переменные обновляются как необходимо при изменении их зависимостей.
Одна из ошибок - имена переменных не отчищаются от пробелов до и после при присваивании. Поэтому вы присваиваете значение в "      x ", а читаете из "x" и это не работает.
Похожие вопросы