Cod sursa(job #3248901)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 13 octombrie 2024 18:23:32
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <string>

using namespace std;

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

string remove_spaces(const string &s)
{
    string ans = "";

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

    return ans;
}

string read()
{
    string answer = "";
    f >> answer;

    return remove_spaces(answer);
}

int eval(const string &s, int &i);
int termen(const string &s, int &i);
int factor(const string &s, int &i);

/// s = (t1) + (t2) - (t3) + .... + (tk)
int eval(const string &s, int &i)
{
    int answer = termen(s, i);

    while ((i < (int)s.size()) && (s[i] == '+' || s[i] == '-'))
    {
        if (s[i] == '+')
            ++i, answer += termen(s, i);
        else
            ++i, answer -= termen(s, i);
    }

    return answer;
}

/// t_i = (f1) * (f2) / (f3) * ....
int termen(const string &s, int &i)
{
    int answer = factor(s, i);

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

    return answer;
}

int factor(const string &s, int &i)
{
    if (i >= (int)s.size())
        return 0;

    if (s[i] == '(')
    {
        ++i;
        int answer = eval(s, i);
        /// am ramas pe ')'
        ++i;

        return answer;
    }

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

    return nr;
}

int main()
{
    string s = read();

    int i = 0;
    g << eval(s, i) << '\n';

    return 0;
}