Cod sursa(job #542651)

Utilizator balakraz94abcd efgh balakraz94 Data 26 februarie 2011 18:57:19
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
/*
 * Se va folosi recursivitatea indirecta in rezolvarea problemei.
 * Vom observa ca orice expresie este "impartita" in urmatoarele componente:
 * 1) termeni ai unei adunari, separati de '+' sau '-'
 * 2) factori ai unui produs, separati de '*' sau '/'
 * 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
 * Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
 * si implicit a necesitatii recursivitatii indirecte.
 */

#include <cstdio>

const long MAX = 100010;
char S[MAX], *p=S;

long prod();
long numar();
long eval();

long eval()
{
	long r=prod();
	while(*p=='-' || *p=='+')
	{
	if(*p=='-') 
	{
		++p; 
		r-=prod();
		break;
	}

	else 
	{	
		++p;
		r+=prod();
		break;
	}
	}
	
	return r;
}


long prod()
{
	long r=numar();
	while(*p=='*' || *p=='/')
	{
		if(*p=='*')
		{
		++p;
		r*=numar();	
		break;
		}
		else 
		{
			++p;
			r/=numar();
			break;
		}
	}
	return r;
}
	
long numar()
{
	long r=0;
	
	if(*p=='(' ||*p==')')
	{
		++p;
		r = eval();
		++p;
	}
	else 
	{
		while( *p>='0' && *p<='9')
		{
		r = r*10 + *p - '0';
		++p;
		}
	}
	return r;
}




int main() { 
    fgets(S, MAX, fopen("evaluare.in", "r"));  
    fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());  
    return 0;
}