Cod sursa(job #156486)

Utilizator snaked31Stanica Andrei snaked31 Data 12 martie 2008 16:26:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <cstdio>
#include <iostream>
//#include <ctype.h>
#include <map>
#include <string>

using namespace std;

#define nm 256
#define pb push_back

map <string, string> H;

char s1[nm];

string s, s2;
int sol, i, p, n;

int exp();
int getnr();

string find(string u)

{
	if (H.find(u) == H.end()) return u;
	H[u] = find(H[u]);
	return H[u];
}


int pow(int x, int y)

{
	int aux;
	if (y == 0)
		return 1;
	if (y & 1)
		return (x * pow(x, y-1));
	else
		aux = pow(x, y/2);
	return aux*aux;
}


int transf(string ret)

{
	int i;
	for (i=0; i<ret.size(); ++i)
	{
		if (ret[i] < '0' || ret[i] > '9')
			return 0;
	}

	int ret2 = 0;
	for (i=0; i<ret.size(); ++i)
	{
		ret2 = ret2 *10 + ret[i] - '0';
	}
	return ret2;
}


int getnr()

{
	string ret2;
	while ((s2[p] >= '0' && s2[p] <= '9') || (s2[p] >= 'a' && s2[p] <= 'z') || (s2[p] >= 'A' && s2[p] <= 'Z'))
	{
		ret2.pb(s2[p]);
		++ p;
	}

	if (H.find(ret2) != H.end())
		return transf(find(ret2));
	return transf(ret2);
}


int fact()

{
	int ret = 0, x = 1;
	if (s2[p] == '+' || s2[p] == '-')
	{
		x = 1;
		if (s2[p] == '-')
			x = 2;
		++p;
	}
	if (s2[p] == '(')
	{
		++p;
		ret = exp();
		++p;
	}
	else ret = getnr();
	if (x == 2)
		ret *= -1;
	if (s2[p] == '^' && p < n)
	{
		++p;
		int ret2;

		ret2 = fact();
		ret = pow(ret, ret2); 
	}

	return ret;
}


int ter()

{
	int ret = fact(), ret1, sm1, sm2;
	int x;
	while (p < n && (s2[p] == '*' || s2[p] == '/' || s2[p] == '%'))
	{
		x = 1;
		if (s2[p] == '/')
			x = 2;
		else
		if (s2[p] == '%')
			x = 3;
		++p;
		if (x == 1)
			ret *= fact();
		else
		if (x == 2)
		{
			sm1 = 1;
			if (ret < 0)
			{
				sm1 = 0;
				ret *= -1;
			}
			ret1 = fact();
			sm2 = 1;
			if (ret1 < 0)
			{
				sm2 = 0;
				ret1 *= -1;
			}
			ret /= ret1;
			if (sm1 != sm2)
			{
				ret *= -1;
			}
		}
		else
		if (x == 3)
		{
			sm1 = 1;
			if (ret < 0)
			{
				sm1 = 0;
				ret *=-1;
			}
			ret1 = fact();
			sm2 = 1;
			if (ret1 < 0)
			{
				sm2 = 0;
				ret1 *= -1;
			}
			ret %=ret1;
			if (sm1 != sm2)
				ret *= -1;
		}

	}
	return ret;
}


int exp()

{
	int ret = ter();
	int x;
	while (p < n && (s2[p] == '+' || s2[p] == '-'))
	{
		x = 2;
		if (s2[p] == '+')
			x = 1;

		++p;
		if (x == 1)
			ret += ter();
		else
			ret -= ter();
	}
	return ret;
}


void readnsolve()

{
	s2.clear();
	getline(cin, s2);
	p = 0;
	n = s2.size();
	sol = exp();
}


void write()

{
		printf("%d\n", sol);
}


int main()

{
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out","w",stdout);

	readnsolve();
	write();

	return 0;
}