Pagini recente » Cod sursa (job #851828) | Cod sursa (job #363513) | Cod sursa (job #2468631) | Cod sursa (job #476814) | Cod sursa (job #2228768)
/**
* 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 <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
constexpr ull MAX = 100010;
char S[MAX], *p=S;
ull termen();
ull factor();
/**
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
*/
ull eval() {
ull 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.
*/
ull termen() {
ull 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
*/
ull factor() {
ull r=0;
/// cout<<"F:"<<"\n"<<p<<'\n';
if ( *p == '(' ) { /// avem o subexpresie
++p; /// trecem peste '('
r = eval();
/// cout<<"P: ( ) \n"<<r<<"\n"<<p<<'\n';
++p; /// trecem peste ')'
} else {
while ( *p>='0' && *p<='9' ) { /// avem un numar
r = r*10 + *p - '0';
++p;
}
}
return r;
}
int main() {
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
cin.getline(S,MAX);
cout<<eval();
return 0;
}