Cod sursa(job #2730955)

Utilizator enedumitruene dumitru enedumitru Data 27 martie 2021 08:11:56
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 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 <bits/stdc++.h>
using namespace std;
ifstream f("evaluare.in"); ofstream g("evaluare.out");
char S[100010],*p=S;
int termen(),factor();
int eval() /// Functia eval() va "aduna/scadea" toti termenii unei expresii/subexpresii.
{	int r=termen();
	while(*p=='+' || *p=='-')
		switch(*p)
        {   case '+' : ++p; r+=termen(); break;
            case '-' : ++p; r-=termen();
        }
	return r;
}
int termen() /// Functia termen() va "inmulti/impartii" toti factorii unui termen.
{	int r=factor();
	while(*p=='*' || *p=='/')
		switch(*p)
        {   case '*' : ++p; r*=factor(); break;
            case '/' : ++p; r/=factor();
        }
	return r;
}
int factor() /// Functia factor() va returna valoarea unei subexpresii sau un numar natural
{   int r;
    if(*p =='(') {++p; r=eval(); ++p;}
        else
        {   r=0;
            while('0'<=*p && *p<='9')  {r=r*10+*p-'0'; ++p;}
        }
    return r;
}
int main()
{   f>>S;
    g<<eval()<<'\n'; g.close(); f.close(); return 0;
}