Pagini recente » Cod sursa (job #2924384) | Cod sursa (job #1459126) | Cod sursa (job #3041190) | Cod sursa (job #2681103) | Cod sursa (job #2730955)
/** 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;
}