Pagini recente » Cod sursa (job #1611961) | Cod sursa (job #2036513) | Cod sursa (job #2137219) | Cod sursa (job #1819771) | Cod sursa (job #1465974)
/*
* 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 <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
ifstream fin ( "evaluare.in" ) ;
ofstream fout ( "evaluare.out" ) ;
char expresie [1000001] , *p = expresie ;
void Citire ()
{
fin.getline ( expresie , 1000001 ) ;
}
long termen();
long factor();
/*
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
*/
long eval()
{
long 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;
}
/*
* Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
* lui din factori inmultiti.
*/
long termen()
{
long r = factor();
while ( *p == '*' || *p == '/' )
{
switch ( *p )
{
case '*' :
++p;
r *= factor();
break;
case '/':
++p;
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 = 0 ;
if ( *p == '(' )
{ // avem o subexpresie
++ p; // trecem peste '('
r = eval();
++ p; // trecem peste ')'
}
else
{
while ( *p >= '0' && *p <= '9' ) // avem un numar
{
r = r * 10 + *p - '0';
++ p;
}
}
return r;
}
int main()
{
Citire() ;
fout << eval () ;
return 0;
}