Cod sursa(job #2669489)

Utilizator rARES_4Popa Rares rARES_4 Data 7 noiembrie 2020 09:43:21
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("a.in");
ofstream g ("a.out");
char sir[100001];
int lungime;
int compune_nr(int indice)
{
    int nr = 0;
    while(indice<lungime && isdigit(sir[indice]))
    {
        nr = (sir[indice]-'0') + nr*10;
        indice++;
    }
    return nr;
}
int eval_expr(int st,int dr)
{
    int paranteze = 0;
    // cautam cel mai din dreapta semn de minus sau plus care nu e in paranteze
    for(int i = dr;i>=st;i--)
    {
        if(sir[i] == ')')
            paranteze++;
        else
        if(sir[i] == '(')
            paranteze--;
        else
        if(sir[i] == '+' && paranteze  == 0)
            return eval_expr(st,i-1) + eval_expr(i+1,dr);
        if(sir[i] == '-' && paranteze  == 0)
            return eval_expr(st,i-1) - eval_expr(i+1,dr);
    }
    paranteze = 0;
    // cautam cel mai din dreapta semn de * sau / care nu e in paranteze
    for(int i = dr;i>=st;i--)
    {
        if(sir[i] == ')')
            paranteze++;
        if(sir[i] == '(')
            paranteze--;
        if(sir[i] == '*' && paranteze  == 0)
            return eval_expr(st,i-1) * eval_expr(i+1,dr);
        if(sir[i] == '/' && paranteze  == 0)
            return eval_expr(st,i-1) / eval_expr(i+1,dr);
    }
    // daca expresia e de genul (2+6) eliminam parantezele
    if(sir[st] == '(' && sir[dr] == ')')
        return eval_expr(st+1,dr-1);
    // daca a mai ramas un singur nr atunci il returnam
    return compune_nr(st);
}
int main()
{
    f.getline(sir,100001);
    lungime = strlen(sir);
    cout << eval_expr(0,lungime-1);
}