Cod sursa(job #2226197)

Utilizator TrixerAdrian Dinu Trixer Data 29 iulie 2018 20:53:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#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;
}