Передача математического выражения в функцию - PullRequest
0 голосов
/ 05 июня 2018

Мне нужно сделать функцию в C++ для вычисления интегралов.Я использую simpsone rule для вычисления значения данного интеграла.Я знаю, как рассчитать это.У меня нет проблем с математикой.Мне нужно знать, как я могу передать целое выражение, чтобы сделать мою программу гибкой.

У меня есть 4 f(x) функции, для которых я должен делать вычисления.Например:

f(x)=2e^x
f(x)=x^3e
etc.

У меня есть два варианта сделать это.

1) Я могу сделать отдельную функцию для каждой функции f(x).

double function1() {
...
calculations 2e^x
...
return resault;
}

double function2() {
...
calculations x^3e
...
return resault;
}

Этот способ легко и быстро написать, но код совсем не гибкий.В этом случае мне нужно сделать новую функцию для каждой новой заданной функции f (x).

Я хотел бы иметь одну функцию, в которую я могу передать выбранную f(x) функцию.

2) Второй случай, который я предпочитаю, - это сделать какой-то интерпретатор выражений.Я думал о том, чтобы поместить части выражения в std::vector и затем сделать вычисления для каждой ячейки vector.

Я уже видел идею разобрать строку в выражении, но я думаю, что в конце она будет почти такой же, как идея с vector.Я могу ошибаться.

Каков наилучший способ сделать мой код гибким и простым в использовании для пользователей (не программистов)?

1 Ответ

0 голосов
/ 05 июня 2018

Предположим, у вас есть функция, которая принимает два выражения и возвращает сумму их результатов.Вы можете передать выражения в функцию, используя lambda expression, которая поддерживается начиная с C++11, следующим образом:

template<typename Func, typename Func2>
int calculate(Func &lambda_expr1, int param1, Func2 &lambda_expr2, int param2)
{
    return lambda_expr1(param1) + lambda_expr2(param2);
}

void main()
{
    // case 1
    auto f1 = [](int p) {return p*p; }; // expression 1
    auto f2 = [](int p) {return p*p*p; }; // expression 2
    int result = calculate(f1, 3, f2, 4);
    // result = 73

    // case 2
    result = calculate([](int p) {return p*p/2; }, 4, [](int p) {return p*p*p/3; }, 3);
    // result = 17
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...