Cod sursa(job #172840)

Utilizator slayer4uVictor Popescu slayer4u Data 6 aprilie 2008 20:25:08
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

long i, poz, n, k;
char exp[100010];

long elem();

long eval(long mode)
{
	long rez;
	switch (mode)
	{
		case 1:
			rez = eval(2);
			for (; exp[poz] == '+' || exp[poz] == '-';)
			{
				poz++;
				if (exp[poz - 1] == '+')
					rez += eval(2);
				else
					rez -= eval(2);
			}
			return rez;
			break;
		case 2:
			rez = elem();
			for (; exp[poz] == '*' || exp[poz] == '/';)
			{
				poz++;
				if (exp[poz - 1] == '*')
					rez *= elem();
				else
					rez /= elem();
			}
			return rez;
			break;
	}
}

long elem()
{
	long rez = 0;
	if (exp[poz] == '(')
	{
		poz++;
		rez = eval(1);
		poz++;
	}
	else
		while (isdigit(exp[poz]))
			rez = rez * 10 + exp[poz] - '0', poz++;
	return rez;
}

/*
long number()
{
	long nr = 0;
	if (exp[poz] != '(')
	{
		while (isdigit(exp[poz]))
			nr = nr * 10 + exp[poz ++] - '0';
		return nr;
	}
	poz ++;
	nr = eval(),	poz ++;
	return nr;
}

long eval()
{
	if (poz <= n - 1)
	{
		long rez = number();
		for (; exp[poz] == '+' || exp[poz] == '-' || exp[poz] == '*' || exp[poz] == '/';)
		{
			if (exp[poz] == '+')
			{
				poz ++;
				long k = number();
				rez += k;
			}
			else
			if (exp[poz] == '-')
			{
				poz ++;
				long k = number();
				rez -= k;
			}
			else
			if (exp[poz] == '*')
			{
				poz ++;
				long k = number();
				rez *= k;
			}
			else
			if (exp[poz] == '/')
			{
				poz ++;
				long k = number();
				rez /= k;
			}
		}
		return rez;
	}
}
*/

int main()
{
	freopen ("evaluare.in", "rt", stdin);
	freopen ("evaluare.out", "wt", stdout);

	scanf("%s", exp);
	n = strlen(exp);
	poz = 0;

	printf("%ld\n", eval(1));
	return 0;
}