Cod sursa(job #477694)
/*
** Metoda de rezolvare foloseste recursivitatea indirecta.
** Elementele unei expresii sunt termenii (separati prin + sau -)
** si subexpresiile incadrate intre ( ).
** Un termen poate fi la randul sau compus din factor (separati prin * sau /);
** Subexpresiile, asemenea expresiilor, sunt alcatuite din termeni.
*/
#include <stdio.h>
#include <string.h>
using namespace std;
char e[100001];
int lg, i, j, k;
int rezultat;
int evaluare_expresie ();
int evaluare_termen ();
int evaluare_factor ();
int e_operator (char ch) // verficica daca elementul curent este cifra
{
if (ch >= '0' && ch <= '9')
return 1;
return 0;
}
int evaluare_expresie() // functia evaluare_expresie () va aduna/scadea toti termenii expresiei/subexpresiei
{
int r;
r = evaluare_termen ();
while (e[i] == '+' || e[i] == '-') // cat timp mai am termeni
{
if (e[i] == '+')
{
i ++; // trec peste semnul +
r += evaluare_termen ();
}
else if (e[i] == '-')
{
i ++; // trec peste semnul -
r -= evaluare_termen ();
}
}
return r;
}
int evaluare_termen () // functia va inmulti/scadea toti factorii din termen
{
int r;
r = evaluare_factor ();
while (e[i] == '*' || e[i] == '/')
{
if (e[i] == '*')
{
i ++; // trec peste semnul *
r *= evaluare_factor ();
}
else if (e[i] == '/')
{
i ++; // trec peste semnul /
r /= evaluare_factor ();
}
}
return r;
}
int evaluare_factor () // functia va returna un factor sau o subexpresie
{
int r = 0;
if (e[i] == '(') // am gasit o subexpresie
{
i ++; // trecem peste (
r = evaluare_expresie (); // evaluam subexpresia
i ++; // trecem peste )
}
else
{
while (e_operator (e[i]))
{
r = r * 10 + e[i] - '0';
i ++;
}
}
return r;
}
int main ()
{
FILE *f = fopen ("evaluare.in","r");
FILE *g = fopen ("evaluare.out","w");
fscanf (f,"%s", e);
lg = strlen (e);
rezultat = evaluare_expresie ();
fprintf (g, "%d\n", rezultat);
fclose (g);
fclose (f);
return 0;
}