Cod sursa(job #2422698)

Utilizator enedumitruene dumitru enedumitru Data 19 mai 2019 17:52:30
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 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 <fstream>
#include <string.h>
using namespace std;
ifstream f("evaluare.in"); ofstream g("evaluare.out");
int MAX;
char S[100010], *p=S;
int termen();
int factor();
int eval() // Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
{	int r = termen();
	while ( *p=='+' || *p=='-' ) 
		switch ( *p ) 
			{case '+' :	++p;						// trecem peste semnul "+"
						r += termen(); break;
			 case '-' : ++p;						// trecem peste semnul "-"
						r -= termen(); break;
			}
	return r;
}
int termen() // Functia termen() se ocupa de continutul unui termen ce e compus din factori inmultiti
{	int r = factor();
	while ( *p=='*' || *p=='/' )
		switch ( *p ) 
			{case '*' : ++p; r *= factor(); break;
			 case '/' : ++p; r /= factor(); break;
			}
	return r;
}
int factor() // Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie sau un numar natural
{   int r=0;  
    if (*p =='(') 	{// avem o subexpresie
					 ++p;					// trecem peste '('
					 r = eval(); 
					 ++p;					// trecem peste ')'
					}
			else 	{// avem un numar
					 while ( *p>='0' && *p<='9' )  {r = r*10 + *p - '0'; ++p;}
				    }  
    return r;
}
int main()
{f>>S; MAX=strlen(S); g<<eval()<<'\n'; g.close(); return 0;}