Pagini recente » Cod sursa (job #2334702) | Cod sursa (job #1597142) | Cod sursa (job #1154859) | Cod sursa (job #2527761) | Cod sursa (job #2669491)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("evaluare.in");
ofstream g ("evaluare.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);
g << eval_expr(0,lungime-1);
}