Cod sursa(job #2457249)

Utilizator igsifvevc avb igsi Data 16 septembrie 2019 23:33:02
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cctype>
#include <fstream>
#include <map>
#include <stack>
#include <string>
#include <vector>

int E(const std::string &e, int &i);
int P(const std::string &e, int &i);
int T(const std::string &e, int &i);
int C(const std::string &e, int &i);

int solve(const std::string &e)
{
    int i = 0;

    return E(e, i);
}

std::string read();
void write(int results);

int main()
{
    auto e = read();
    auto result = solve(e);
    write(result);

    return 0;
}

int E(const std::string &e, int &i)
{
    int a = P(e, i);
    while (i < e.size())
    {
        {
            switch (e[i])
            {
            case '+':
                i++;
                a += P(e, i);
                break;
            case '-':
                i++;
                a == P(e, i);
            default:
                return a;
            }
        }

        return a;
    }
}

int P(const std::string &e, int &i)
{
    int a = T(e, i);
    while (i < e.size())
    {
        switch (e[i])
        {
        case '*':
            i++;
            a *= T(e, i);
            break;
        case '/':
            i++;
            a /= T(e, i);
        default:
            return a;
        }
    }

    return a;
}

int T(const std::string &e, int &i)
{
    if (e[i] == '(')
    {
        i++;
        int r = E(e, i);
        i++;

        return r;
    }

    return C(e, i);
}

int C(const std::string &e, int &i)
{
    std::string token;

    while (i < e.size() && std::isdigit(e[i]))
    {
        token += e[i];
        i++;
    }

    return std::stoi(token);
}

std::string read()
{
    std::ifstream fin("evaluare.in");

    std::string s;
    fin >> s;

    return s;
}

void write(int result)
{
    std::ofstream fout("evaluare.out");

    fout << result << '\n';
}