Pagini recente » Cod sursa (job #2944188) | Cod sursa (job #1195636) | Cod sursa (job #1869907) | Cod sursa (job #545609) | Cod sursa (job #655771)
Cod sursa(job #655771)
/* 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>
#include <string>
using namespace std;
ifstream f("evaluare.in"); ofstream g("evaluare.out");
int MAX;
char S[100010], *p=S;
int termen();
int factor();
int eval() // Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
{ int r = termen();
while ( *p=='+' || *p=='-' )
switch ( *p )
{case '+' : ++p; // trecem peste semnul "+"
r += termen(); break;
case '-' : ++p; // trecem peste semnul "-"
r -= termen(); break;
}
return r;
}
int termen() // Functia termen() se ocupa de continutul unui termen ce e compus din factori inmultiti
{ int r = factor();
while ( *p=='*' || *p=='/' )
switch ( *p )
{case '*' : ++p; r *= factor(); break;
case '/' : ++p; r /= factor(); break;
}
return r;
}
int factor() // Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie sau un numar natural
{ int r=0;
if (*p =='(') {// avem o subexpresie
++p; // trecem peste '('
r = eval();
++p; // trecem peste ')'
}
else {// avem un numar
while ( *p>='0' && *p<='9' ) {r = r*10 + *p - '0'; ++p;}
}
return r;
}
int main()
{f>>S; MAX=strlen(S); //fgets(S, MAX, fopen("evaluare.in", "r"));
g<<eval()<<'\n'; //fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());
g.close(); return 0;
}