Cod sursa(job #351810)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 29 septembrie 2009 15:16:51
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 100100
#define fin  "evaluare.in"
#define fout "evaluare.out"

char buff[NMAX];
int p, rang[257];

int eval();

int termen()
{
	int ret = 0;

	if ( buff[p] == '(' )
		++p, ret = eval();
	else
	{
		while ( '0' <= buff[p] && buff[p] <= '9' )
			ret = ret * 10 + buff[p] - '0', ++p;
	}

	return ret;
}

int eval()
{
	int ret = termen();
	char currRang = rang[ buff[p] ];

	while ( buff[p] != NULL && buff[p] != ')' )
	{
		if ( rang[ buff[p] ] != currRang )
		{
			if ( buff[p] == '+' )
				++p, ret += eval();
			else
			if ( buff[p] == '-' )
				++p, ret -= eval();
			else
			if ( buff[p] == '/' )
				++p, ret /= eval();
			else
				++p, ret *= eval();
		}
		else
		{
			if ( buff[p] == '+' )
				++p, ret += termen();
			else
			if ( buff[p] == '-' )
				++p, ret -= termen();
			else
			if ( buff[p] == '/' )
				++p, ret /= termen();
			else
				++p, ret *= termen();	
		}
	}
	++p;

	return ret;
}

int main()
{
	ifstream f1(fin);
	ofstream f2(fout);

	f1.getline(buff, NMAX);

	p = 0;
	rang[ '+' ] = rang[ '-' ] = 1;
	rang[ '/' ] = rang[ '*' ] = 2;

	f2 << eval() << endl;

	return 0;
}