Pagini recente » Cod sursa (job #2627853) | Cod sursa (job #66666) | Cod sursa (job #659715) | Cod sursa (job #770894) | Cod sursa (job #2869262)
/*
* 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>
#define dim 1e9 + 2
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char sir[dim], *p = sir;
long termen();
long factor();
//Functie care aduna/scade termenii unei expresii.
long eval() {
long rez = termen();
while( *p == '+' || *p == '-' ) {
if( *p == '+' ) {
p++;
rez += factor();
break;
} else if( *p == '-' ) {
p++;
rez -= factor();
break;
}
}
return rez;
}
//Functie care se ocupa de continutul unui termen, acesta fiind compus
//din factori inmultiti/impartiti.
long termen() {
long rez = factor();
while( *p == '*' || *p == '/' ) {
if( *p == '*' ) {
p++;
rez *= factor();
break;
} else if( *p == '/' ) {
p++;
rez /= factor();
break;
}
}
return rez;
}
//Functie care returneaza un factor, fie numar fie subexpresie.
//Subexpresie = (...), adica cu paranteze.
long factor() {
long rez = 0;
if( *p == '(') {
//suntem pe o subexpresie
p++;
rez = eval();
p++;
} else {
//suntem pe un numar
while('0' <= *p && *p <= '9') {
rez = rez * 10 + (*p - '0');
p++;
}
}
return rez;
}
int main() {
fin >> sir;
fout << eval();
return 0;
}