Pagini recente » Borderou de evaluare (job #1791282) | Borderou de evaluare (job #1144892) | Borderou de evaluare (job #128946) | Borderou de evaluare (job #853887) | Cod sursa (job #1302482)
#define IA_PROB "evaluare"
#include <cstdio>
#include <cstring>
#include <fstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
string ops[2] = {"+-", "*/"};
int eval(char *&p, int level);
int op_level(char op)
{
switch (op) {
case '+':
case '-':
return 0;
case '*':
case '/':
return 1;
default:
return -1;
}
}
int eval_op(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: exit(-2);
}
}
int operand(char *&p)
{
int res;
if (*p == '(') {
p++;
res = eval(p, 0);
p++; /* to skip over ')' */
} else {
res = 0;
while (*p >= '0' && *p <= '9') {
res = res * 10 + *p - '0';
p++;
}
}
return res;
}
int eval(char *&p, int level)
{
if (level == 2) {
return operand(p);
} else {
int a = eval(p, level + 1);
while (op_level(*p) == level) {
char op = *p;
p++;
int b = eval(p, level + 1);
a = eval_op(op, a, b);
}
return a;
}
}
int main()
{
ifstream in(IA_PROB".in");
ofstream out(IA_PROB".out");
string s;
in>>s;
char *p = (char*)s.c_str();
out<<eval(p, 0)<<endl;
return 0;
}