@RetroCR

Не могу найти ошибку в коде?

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

Не могу понять, почему не меняются значения Y и Z, когда я меняю X.
Вот код:
#include <iostream>
#include <string>
#include <sstream>
#include <unordered_map>
#include <cmath>
#include <functional>

using namespace std;

unordered_map<string, double> variables;

double eval_expr(const string& expr) {
    string updated_expr = expr;
    for (const auto& 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) + 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(cos(arg)));
        pos = updated_expr.find("cos", pos);
    }

    // Обработка sqr для квадратного корня
    pos = updated_expr.find("sqr");
    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(sqrt(arg)));
        pos = updated_expr.find("sqr", pos);
    }

    istringstream iss(updated_expr);
    double result;
    iss >> result;
    return result;
}

void execute_line(const string& line) {
    if (line.find('=') != string::npos) {
        string var = line.substr(0, line.find('='));
        string expr = line.substr(line.find('=') + 1);
        variables[var] = eval_expr(expr);
    }
    else if (line.find("if") == 0) {
        size_t pos_then = line.find("then");
        if (eval_expr(line.substr(3, pos_then - 3))) {
            string block = line.substr(pos_then + 4);
            // Execute block
        }
    }
    else if (line.find("while") == 0) {
        size_t pos_do = line.find("do");
        while (eval_expr(line.substr(6, pos_do - 6))) {
            string block = line.substr(pos_do + 2);
            // Execute block
        }
    }
}

void interpret(const string& script) {
    istringstream iss(script);
    string line;

    while (getline(iss, line)) {
        size_t pos = line.find("for");
        if (pos != string::npos) {
            // Обработка for цикла
            continue;
        }
        execute_line(line); // Вызов функции для выполнения строки
    }
}

int main() {
    string script = R"(
        x = 25;
        y = sqr(x);
        z = cos(x);
        for (int i = 0; i < 3; i++) {
            b = sin(i);
            if (b > 0.5) break;
        }
    )";

    interpret(script);

    for (const auto& var : variables) {
        cout << var.first << " = " << var.second << endl;
    }

    return 0;
}
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Одна из ошибок - имена переменных не отчищаются от пробелов до и после при присваивании. Поэтому вы присваиваете значение в " x ", а читаете из "x" и это не работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы