Pagini recente » Cod sursa (job #3238582) | Cod sursa (job #2538169) | Cod sursa (job #1514823) | Cod sursa (job #2878961) | Cod sursa (job #1204986)
/*
* 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>
#include <cstring>
using namespace std;
char s[100010];
int n,poz;
int Factori();
int Paranteza();
int Evaluare()
{
int nr=Factori();
while(s[poz]=='+' || s[poz]=='-')
{
if(s[poz]=='+')
{
poz++;
nr=nr+Factori();
}
else
{
poz++;
nr=nr-Factori();
}
}
return nr;
}
int Factori()
{
int nr=Paranteza();
while(s[poz]=='*' || s[poz]=='/')
{
if(s[poz]=='*')
{
poz++;
nr=nr*Paranteza();
}
else
{
poz++;
nr=nr/Paranteza();
}
}
// printf("%d ",nr);
return nr;
}
int Paranteza()
{
int nr=0;
if(s[poz]=='(')
{
poz++;
nr=Evaluare();
poz++;
}
else while(s[poz]<='9' && s[poz]>='0')
{
nr=s[poz]-'0'+nr*10;
poz++;
}
return nr;
}
int main()
{
freopen("evaluare.in","r",stdin);
scanf("%s",s+1);
n=strlen(s+1);
poz=1;
freopen("evaluare.out","w",stdout);
printf("%d ",Evaluare());
return 0;
}