Cod sursa(job #3251986)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 28 octombrie 2024 02:09:19
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <string>

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

class solver
{
    string s;
    int n;

    string remove_spaces(const string &s) const
    {
        string answer;

        for (const char &c : s)
            if (c == ' ')
                continue;
            else
                answer += c;

        return answer;
    }

    int eval(int &i)
    {
        int answer = term(i);

        while ((i < n) && (s[i] == '+' || s[i] == '-'))
        {
            if (s[i] == '+')
                ++i, answer += term(i);
            else
                ++i, answer -= term(i);
        }

        return answer;
    }

    int term(int &i)
    {
        int answer = factor(i);

        while ((i < n) && (s[i] == '*' || s[i] == '/'))
        {
            if (s[i] == '*')
                ++i, answer *= factor(i);
            else
                ++i, answer /= factor(i);
        }

        return answer;
    }

    int factor(int &i)
    {
        if (i >= n)
            return 0;

        if (s[i] == '(')
        {
            ++i;
            int answer = eval(i);
            ++i;

            return answer;
        }

        int answer = 0;
        while ((i < n) && (s[i] >= '0' && s[i] <= '9'))
            answer = answer * 10 + (int)(s[i] - '0'), ++i;

        return answer;
    }

public:
    solver() = default;
    ~solver() = default;

    solver(const string &input)
    {
        s = remove_spaces(input),
        n = (int)s.size();
        return;
    }

    int get()
    {
        int i = 0;
        return eval(i);
    }
};

int main()
{
    string s;
    f >> s;

    solver X(s);

    g << X.get() << '\n';

    return 0;
}