Pagini recente » Cod sursa (job #2462542) | Cod sursa (job #1524610) | Cod sursa (job #2268237) | Cod sursa (job #312478) | Cod sursa (job #1538003)
/*
* 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 <cstring>
using namespace std;
const int nmax = 1000010;
char s[nmax] , *p = s;
long termen();
long factor();
long eval();
int main(){
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(s, nmax, stdin);
printf("%ld\n", eval());
fclose(stdin);
fclose(stdout);
return 0;
}
long eval() {
long r = termen();
while (*p == '+' || *p == '-') {
if (*p == '+') { ++p; r += termen(); }
else if (*p == '-') { ++p; r -= termen(); };
}
return r;
}
long termen() {
long r = factor();
while (*p == '*' || *p == '/') {
if (*p == '*') { ++p; r *= factor(); }
else if (*p == '/') { ++p; r /= factor(); };
}
return r;
}
long factor(){
long r = 0;
if (*p == '(') {
++p;
r = eval();
++p;
}
else while ( strchr("0123456789", *p) && *p !='\0' ) {
r = r * 10 + *(p++) - '0';
}
return r;
}