Cod sursa(job #936476)
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;
const int MAXLEVEL = 2;
const int ERROR = - (1 << 29);
string exp;
string::iterator it, iend;
const string op[] = {"+-", "/*", "^"};
inline int eval(char op, int a, int b)
{
switch(op)
{
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
case '/' : return a / b;
default : return ERROR;
}
}
inline int eval(int level)
{
int x;
if(MAXLEVEL == level)
{
if('(' == *it)
{
++it;
x = eval(0);
++it;
}
else for(x = 0; it < iend && *it >= '0' && *it <= '9'; ++it)
{
x = x * 10 + *it - '0';
}
}
else for(x = eval(level + 1); it < iend && string::npos != op[level].find(*it); )
{
char op = *(it++);
x = eval(op, x, eval(level + 1));
}
return x;
}
int main()
{
ifstream in("evaluare.in");
ofstream out("evaluare.out");
getline(in, exp);
it = exp.begin();
iend = exp.end();
out << eval(0) << '\n';
return EXIT_SUCCESS;
}