Cod sursa(job #3276380)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 13 februarie 2025 15:25:27
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

const int L_MAX = 1e5 + 5;
char s[L_MAX];
int p = 0;

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

int Factor();
int Termen();

int Eval() /// aduna / scade operatii simplificate din interiorul ulei paranteze
{
    int r = Termen();
    while(s[p] == '+' || s[p] == '-')
        if(s[p] == '+')
        {
            p++;
            r += Termen();
        }
        else /// s[p] == '-'
        {
            p++;
            r -= Termen();
        }

    return r;
}

int Termen() /// inmulteste / impartieste numere
{
    int r = Factor();
    while(s[p] == '*' || s[p] == '/')
        if(s[p] == '*')
        {
            p++;
            r *= Factor();
        }
        else /// s[p] == '/'
        {
            p++;
            r /= Factor();
        }
    return r;
}

int Factor() /// returneaza urmatorul numar, sau expresie daca este cazul
{
    int r = 0;
    if(s[p] == '(') /// incepe o noua paranteza
    {
        p++;
        r = Eval();
        p++;
    }
    else
    {
        while(s[p] >= '0' && s[p] <= '9')
        {
            r = r * 10 + s[p] - '0';
            p++;
        }
    }
    cerr << p << ' ' << r << '\n';
    return r;
}

void ReadInput()
{
    cin.getline(s, L_MAX);
}

int main()
{
    SetInput("evaluare");

    ReadInput();
    cout << Eval();

    return 0;
}