Cod sursa(job #887742)

Utilizator XeBluePodaru Mihai XeBlue Data 24 februarie 2013 02:31:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
/*	Pentru a rezolva problema avem nevoie de trei functi si un vector de tip char ce trebuie sa aiba cel putin 100000 de poziti.
	Vom lucra cu un pointer ce va creste mereu cand trecem peste un caracter din sir.
	In functia evaluator vom efectua doar operatiile cu + si - cu termeni.
	Consideram termen tot ce este intre doua semne + sau -, adica daca intalnim *,/ sau ( le vom trata separat 
	Pana ce ajungem din nou la + sau - si astfel formam un termen.
	Daca intalnim mai multe cifre pe poziti consecutive in sir atunci vom calcula numarul in functia numar
	Daca intalnim semnul ( calculam valoarea parantezei pentru a rezuma totul la un numar
*/ 
	
#include<fstream>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define N 100005
char expresie[N];
char *p=expresie;
int termen();
int numar();

int evaluator()
{
	long long r=termen();
	while(*p=='+' || *p=='-')
	{
		if(*p=='+')
		{
			p++;
			r+=termen();
		}
		else
		{
			p++;
			r-=termen();
		}
	}
	return r;
}

int termen()
{
	long long r=numar();
	while(*p=='*' || *p=='/')
	{
		if(*p=='*')
		{
			p++;
			r*=numar();
		}
		else
		{
			p++;
			r/=numar();
		}
	}
	return r;
}

int numar()
{
	long long r=0;
	if(*p=='(')
	{
		p++;
		r=evaluator();
		p++;
	}
	else while(*p>='0' && *p<='9')
	{
		r=r*10+(*p-'0');
		p++;
	}
	return r;
}

int main()
{
	in.get(expresie,100005);// citim tot sirul
	out << evaluator();//apelam functia evaluator si afisam rezultatul
	in.close();
	out.close();
	// Sper ca ati inteles :D
}