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


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

using namespace std;

// Структура и функции работы со стеком из лекции [cite: 64-79]
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;
}

// Массив для хранения значений переменных [cite: 80]
double masz[122]; 

double calculate13(char *str, double *mz) {
    tstk *sp = NULL;
    double inf, opTrue, opFalse, condition, v1, v2;

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

        // Если найден операнд (переменная a, b, c...), берем её значение из массива 
        if (ch >= 'a' && ch <= 'z') { 
            sp = AddStack(sp, mz[int(ch)]); 
            continue;
        }

        // Если тернарный оператор '?'
        if (ch == '?') {
            sp = ReadStack(sp, opFalse);   // Извлекаем "ложь" (LIFO) [cite: 38]
            sp = ReadStack(sp, opTrue);    // Извлекаем "истина"
            sp = ReadStack(sp, condition); // Извлекаем условие
            
            // Если условие > 0 (истина), кладем opTrue, иначе opFalse
            sp = AddStack(sp, (condition > 0) ? opTrue : opFalse);
        } 
        // Если знаки операций или сравнения [cite: 146-155]
        else {
            sp = ReadStack(sp, v2); 
            sp = ReadStack(sp, v1);
            
            switch (ch) {
                case '>': sp = AddStack(sp, (v1 > v2) ? 1.0 : 0.0); break;
                case '<': sp = AddStack(sp, (v1 < v2) ? 1.0 : 0.0); break;
                case '+': sp = AddStack(sp, v1 + v2); break;
                case '-': sp = AddStack(sp, v1 - v2); break;
                case '*': sp = AddStack(sp, v1 * v2); break;
                case '/': sp = AddStack(sp, v1 / v2); break;
            }
        }
    }
    sp = ReadStack(sp, inf);
    return inf;
}

int main() {
    char str[100];
    
    // Ввод значений переменных как в лекции 
    cout << "Vvedite a: "; cin >> masz[int('a')];
    cout << "Vvedite b: "; cin >> masz[int('b')];
    cout << "Vvedite c: "; cin >> masz[int('c')];
    cout << "Vvedite d: "; cin >> masz[int('d')];
    cout << "Vvedite e: "; cin >> masz[int('e')];

    // Пример ввода ОПЗ: ab>cd? (Если a>b, то c, иначе d)
    cout << "Vvedite viragenie v OPZ (naprimer, ab>cd?): ";
    cin >> str;

    double result = calculate13(str, masz);
    cout << "Result = " << result << endl;

    return 0;
}