Загрузка данных


#include <iostream>
#include <string.h>

using namespace std;

// Стандартная структура стека из лекционного материала [cite: 64-67]
struct tstk {
    double inf;
    tstk *a;
};

tstk* AddStack(tstk* sp, double inf) {
    tstk* spt = new tstk;
    spt->inf = inf;
    spt->a = sp;
    return spt;
}

tstk* ReadStack(tstk* sp, double& inf) {
    tstk* spt = sp;
    inf = sp->inf;
    sp = sp->a;
    delete spt;
    return sp;
}

// Функция вычисления ОПЗ с подстановкой параметра x [cite: 41-45, 136-156]
double calculateFunction(char* rpn, double x_value) {
    tstk* sp = NULL;
    double inf, op1, op2;

    for (unsigned int i = 0; i < strlen(rpn); i++) {
        char ch = rpn[i];

        // Если встречаем 'x', подставляем значение аргумента [cite: 179-180]
        if (ch == 'x') {
            sp = AddStack(sp, x_value);
        }
        // Если цифра (упрощенный ввод чисел)
        else if (ch >= '0' && ch <= '9') {
            sp = AddStack(sp, ch - '0');
        }
        // Операции из лекции [cite: 146-155]
        else {
            sp = ReadStack(sp, op2);
            sp = ReadStack(sp, op1);
            switch (ch) {
                case '+': sp = AddStack(sp, op1 + op2); break;
                case '-': sp = AddStack(sp, op1 - op2); break;
                case '*': sp = AddStack(sp, op1 * op2); break;
                case '/': sp = AddStack(sp, op1 / op2); break;
            }
        }
    }
    sp = ReadStack(sp, inf);
    return inf;
}

int main() {
    char func_body[100];
    double argument;

    // Имитация формата "f(x) = выражение" 
    cout << "Obyavite f(x). Vvedite viragenie v OPZ (ispolzuite 'x'): " << endl;
    cout << "f(x) = ";
    cin >> func_body;

    // Вызов функции с числовым аргументом 
    cout << "Vvedite argument x dlya vizova f(x): ";
    cin >> argument;

    double result = calculateFunction(func_body, argument);

    cout << "Resultat: f(" << argument << ") = " << result << endl;

    return 0;
}