Pagini recente » Cod sursa (job #622856) | Cod sursa (job #3031440) | Cod sursa (job #493979) | Cod sursa (job #720804) | Cod sursa (job #1463053)
#include <fstream>
#include <string.h>
using namespace std;
#define MAXSIR 100005
#define INF 9999999
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char sir[MAXSIR];
int prioritate(char semn)
{
if(semn=='+' || semn=='-')
return 1;
if(semn=='*' || semn=='/')
return 2;
return INF;
}
int eval(char expr[], int st, int dr)
{
if(expr[st]=='(' && expr[dr]==')')
{
bool ok=true; int nrp=1;
for(int i=st+1; i<dr; i++)
{
if(expr[i]=='(')
nrp++;
if(expr[i]==')')
nrp--;
if(!nrp)
{
ok=false;
break;
}
}
if(ok)
return eval(expr,st+1,dr-1);
}
int p=0,minim=INF,p_minim;
for(int i=st; i<=dr; i++)
{
if(expr[i]=='(')
p++;
if(expr[i]==')')
p--;
if(prioritate(expr[i]) < minim && !p)
{
minim = prioritate(expr[i]);
p_minim=i;
}
}
if(minim!=INF)
{
if(expr[p_minim]=='+')
return eval(expr,st,p_minim-1) + eval(expr,p_minim+1,dr);
if(expr[p_minim]=='-')
return eval(expr,st,p_minim-1) - eval(expr,p_minim+1,dr);
if(expr[p_minim]=='*')
return eval(expr,st,p_minim-1) * eval(expr,p_minim+1,dr);
if(expr[p_minim]=='/')
return eval(expr,st,p_minim-1) / eval(expr,p_minim+1,dr);
}
else
{
int nr=0;
for(int i=st; i<=dr; i++)
{
nr=nr*10+expr[i]-'0';
}
return nr;
}
}
int main()
{
cin.getline(sir,MAXSIR);
cout<<eval(sir,0,strlen(sir)-1);
}