Cod sursa(job #3315245)

Utilizator tudorvoieVoie Tudor tudorvoie Data 13 octombrie 2025 10:31:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

// string cu expresia si incep de la pozitia 0
string s;
int poz = 0;
int evaluare();

int factor() {
    long long rez = 0;
    if(s[poz] == '(') {
        // daca incepe paranteza, o iau ca si pe alta
        // expresie separata, deci bag o alta evaluare
        // si se tot apeleaza ele unele pe altele
        poz++;
        rez = evaluare();
        poz++;
    } else {
        // daca n-am +-*/() inseamna ca am numar, deci construiesc nr
        while(s[poz] >= '0' && s[poz] <= '9') {
            rez = rez * 10 + (s[poz] - '0');
            // si cresc poz
            poz++;
        }
    }
    return rez;
}

int termen() {
    long long f = factor();
    while(s[poz] == '*' || s[poz] == '/') {
        if(s[poz] == '*') {
            // cresc pozitia si inmultesc
            poz++;
            f = f * factor();
        } else if(s[poz] == '/') {
            // cresc pozitia si impart
            poz++;
            f = f / factor();
        }
    }
    return f;
}

int evaluare() {
    int rez = termen();
    while(s[poz] == '+' || s[poz] == '-') {
        if(s[poz] == '-') {
            // cresc pozitia si scad
            poz++;
            rez = rez - termen();
        } else if(s[poz] == '+'){
            // cresc pozitia si adun
            poz++;
            rez = rez + termen();
        }
    }
    return rez;
}

int main()
{
    fin >> s;
    // punem asta aici ca sa oprim programul fiindca n-avem op cu $
    // as putea pune = sau ceva de genu
    s += '$';
    fout << evaluare();
    return 0;
}