Загрузка данных
#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;
}