Pagini recente » Cod sursa (job #1072174) | Cod sursa (job #1104794) | Cod sursa (job #1275364) | Cod sursa (job #1312226) | Cod sursa (job #2226197)
#include <stdio.h>
#include <string.h>
#define MAX_LVL 2
#define MAX_LEN 100005
char expr[MAX_LEN], *p = expr;
char ops[2][3] = {"+-", "*/"};
int eval_op(int a, int b, char op)
{
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int eval_expr(int lvl)
{
int x, y;
char op;
if (lvl == MAX_LVL)
if (*p == '(') {
p++; // skip '('
x = eval_expr(0);
p++; // skip ')'
} else
for (x = 0; *p >= '0' && *p <= '9'; p++)
x = x * 10 + *p - '0';
else {
// Exp(lvl) = Exp(lvl + 1) op(lvl) ... op(lvl) Exp(lvl + 1)
x = eval_expr(lvl + 1);
while (strchr(ops[lvl], *p)) {
op = *p;
p++; // skip op
y = eval_expr(lvl + 1);
x = eval_op(x, y, op);
}
}
return x;
}
int main(void)
{
fgets(expr, sizeof(expr), fopen("evaluare.in", "r"));
fprintf(fopen("evaluare.out", "w"), "%d\n", eval_expr(0));
return 0;
}