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


#include <iostream>
#include <string.h>
#include <map>
using namespace std;

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)
{
    if (!sp) return NULL;
    tstk* spt = sp;
    inf = sp->inf;
    sp = sp->a;
    delete spt;
    return sp;
}

// Структура для хранения функции
struct Function {
    char name;           // имя функции (одна буква)
    char param;          // имя параметра (одна буква)
    char rpn[100];       // выражение в ОПЗ
};

map<char, Function> functions;  // хранилище функций

// Вычисление ОПЗ с подстановкой значения параметра
double calculateRPN(char* rpn, char param, double arg, double* vars)
{
    tstk* sp = NULL;
    double inf, inf1, inf2;
    
    for (unsigned int i = 0; i < strlen(rpn); i++)
    {
        char ch = rpn[i];
        if (ch == ' ') continue;
        
        // Если это параметр функции
        if (ch == param) {
            sp = AddStack(sp, arg);
            continue;
        }
        
        // Если это число
        if (ch >= '0' && ch <= '9') {
            sp = AddStack(sp, (double)(ch - '0'));
            continue;
        }
        
        // Если это переменная из vars
        if (ch >= 'A' && ch <= 'Z' && ch != param) {
            sp = AddStack(sp, vars[(int)ch]);
            continue;
        }
        
        // Оператор
        if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
            if (sp == NULL || sp->a == NULL) {
                cout << "Ошибка: недостаточно операндов!" << endl;
                return 0;
            }
            sp = ReadStack(sp, inf2);
            sp = ReadStack(sp, inf1);
            switch (ch) {
                case '+': sp = AddStack(sp, inf1 + inf2); break;
                case '-': sp = AddStack(sp, inf1 - inf2); break;
                case '*': sp = AddStack(sp, inf1 * inf2); break;
                case '/': sp = AddStack(sp, inf1 / inf2); break;
            }
        }
    }
    
    if (sp == NULL) return 0;
    sp = ReadStack(sp, inf);
    return inf;
}

// Объявление функции: f(x) = x 2 * 3 +
bool declareFunction(char* input)
{
    Function func;
    
    // Парсинг: f(x)=x2*3+
    //  0   1 2 3
    //  f   ( x ) = ...
    
    if (strlen(input) < 6) return false;
    
    func.name = input[0];                    // имя функции
    if (input[1] != '(') return false;
    func.param = input[2];                   // имя параметра
    if (input[3] != ')') return false;
    if (input[4] != '=') return false;
    
    // Копируем ОПЗ (с 5 символа)
    strcpy(func.rpn, input + 5);
    
    functions[func.name] = func;
    cout << "Функция " << func.name << "(" << func.param << ") объявлена" << endl;
    return true;
}

// Вызов функции: f(5)
double callFunction(char name, double arg)
{
    if (functions.find(name) == functions.end()) {
        cout << "Ошибка: функция " << name << " не объявлена!" << endl;
        return 0;
    }
    
    Function& func = functions[name];
    double vars[256] = {0};  // другие переменные не нужны
    
    return calculateRPN(func.rpn, func.param, arg, vars);
}

int main()
{
    char command[200];
    double masz[256] = {0};  // для совместимости с вашим кодом
    
    cout << "Калькулятор с функциями" << endl;
    cout << "========================" << endl;
    cout << "Команды:" << endl;
    cout << "  имя(параметр) = ОПЗ  - объявить функцию" << endl;
    cout << "  имя(число)           - вызвать функцию" << endl;
    cout << "  exit                 - выход" << endl;
    cout << endl;
    
    cout << "Пример: f(x)=x2*3+" << endl;
    cout << "        f(5)" << endl << endl;
    
    while (true) {
        cout << "> ";
        cin.getline(command, 200);
        
        if (strcmp(command, "exit") == 0) break;
        if (strlen(command) == 0) continue;
        
        // Проверка: объявление функции (содержит '=')
        bool isDeclaration = false;
        for (unsigned int i = 0; i < strlen(command); i++) {
            if (command[i] == '=') {
                isDeclaration = true;
                break;
            }
        }
        
        if (isDeclaration) {
            declareFunction(command);
        } 
        else {
            // Вызов функции: f(5)
            if (strlen(command) >= 4 && command[1] == '(') {
                char funcName = command[0];
                
                // Извлекаем аргумент
                int argStart = 2;
                int argEnd = argStart;
                while (argEnd < (int)strlen(command) && command[argEnd] != ')') {
                    argEnd++;
                }
                
                char argStr[20];
                strncpy(argStr, command + argStart, argEnd - argStart);
                argStr[argEnd - argStart] = '\0';
                
                double arg = atof(argStr);
                double result = callFunction(funcName, arg);
                cout << "Результат: " << result << endl;
            }
            else {
                cout << "Неверная команда!" << endl;
            }
        }
    }
    
    return 0;
}