Cod sursa(job #3332891)

Utilizator AnaBAna Batatorescu AnaB Data 9 ianuarie 2026 18:01:16
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string expresie;

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

int pozUltOp( int st, int dr ,char op1, char op2) {
    int nrPar=0;

    for ( int i = dr ; i >= st; i-- ) {
        char x =expresie[i];

        if ( x == ')') {
            nrPar++;
        }
        if ( x == '(' ) {
            nrPar--;
        }

        if ( nrPar == 0 && op1 == expresie[i] || op2 == expresie[i]) {
            return i;
        }
    }
    return -1;
}

int transfNumar(int st, int dr)
{
    int numar=0;

    for(int i=st;i<=dr;i++)
        numar = numar * 10 + ( expresie[i] - '0');
    return numar;
}

int eval( int st, int dr) {

    int poz = pozUltOp( st, dr, '+', '-');

    if ( poz != -1) {
        int expr1 = eval( st, poz - 1);
        int expr2 = eval( poz + 1, dr);

        if ( expresie[poz] == '+') {
            return expr1 + expr2;
        }
        return expr1 - expr2;
    }

    poz = pozUltOp( st, dr, '*', '/');

    if ( poz != -1) {
        int expr1 = eval( st, poz - 1);
        int expr2 = eval( poz + 1, dr);

        if ( expresie[poz] == '*') {
            return expr1 * expr2;
        }
        return expr1 / expr2;
    }

    if ( expresie[st] == '(' && expresie[dr] == ')') {
        return eval( st + 1, dr - 1);
    }
    return transfNumar( st, dr);

}

int main() {

    getline(fin, expresie);
    fout << eval(0, expresie.length() - 1);

    return 0;
}