Pagini recente » Cod sursa (job #2732171) | Cod sursa (job #2546974) | Cod sursa (job #1221675) | Cod sursa (job #521667) | Cod sursa (job #542651)
Cod sursa(job #542651)
/*
* 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;
}