Pagini recente » Cod sursa (job #1758121) | Cod sursa (job #3286121) | Cod sursa (job #2755819) | Cod sursa (job #2925729) | Cod sursa (job #2692925)
/**
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>
#define NM 100001
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[NM];
long termen();
long factor();
int i;
/**
Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
**/
long eval()
{
long r;
r= termen();
while (s[i]=='+' || s[i]=='-')
switch(s[i])
{
case '+':
i++;
r=r+termen();
break;
case '-':
i++;
r=r-termen();
break;
}
return r;
}
/**
Functia termen() se ocupa de continutul unui termen.
Acesta este compus la randul lui din factori inmultiti
sau impartiti
**/
long termen()
{
long r;
r=factor();
while (s[i]=='*' || s[i]=='/')
switch(s[i])
{
case '*':i++;
r=r*factor();
break;
case '/': i++;
r=r/factor();
break;
}
return r;
}
/**
Functia factor() va returna valoarea unui singur factor,
care poate fi o subexpresie sau un numar natural
**/
long factor()
{
long r;
r=0;
if(s[i]=='(') ///avem o subexpresie
{
i++; /// trecem peste '('
r=eval();
i++; /// trecem peste ')'
}
else
while(s[i]>='0' && s[i]<='9')
{
r=r*10+s[i]-'0';
i++;
}
return r;
}
int main()
{
char x;
i=0;
while (fin>>x)
{
i++;
s[i]=x;
}
i=1;
fout<<eval();
return 0;
}