Pagini recente » Cod sursa (job #2150670) | Cod sursa (job #1601377) | Cod sursa (job #2616694) | Cod sursa (job #720884) | Cod sursa (job #430623)
Cod sursa(job #430623)
/*
* 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 <fstream>
using namespace std;
const long MAX = 100010;
string s;
int i;
ifstream fi ("evaluare.in");
ofstream fo ("evaluare.out");
long termen(); // Declaratii ale unor functii care vor fi definite mai tarziu in sursa.
long factor(); // Aici doar spunem ca vor exista aceste functii. Altfel avem eroare la compilare.
/*
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
*/
long eval() {
long r = termen();
while (s[i] == '+' || s[i] == '-') {
if (s[i] == '+') {
i++; // trecem peste semnul "+"
r += termen();
}
else {
i++; // trecem peste semnul "-"
r -= termen();
}
}
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 (s[i] =='*' || s[i] == '/') {
if (s[i] == '*') {
i++;
r *= factor();
}
else {
i++;
r /= factor();
}
}
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 (s[i] == '(') { // avem o subexpresie
i++; // trecem peste '('
r = eval();
i++; // trecem peste ')'
}
else
while (s[i] >= '0' && s[i] <= '9') { // avem un numar
r = r*10+s[i]-'0'; i++;
}
return r;
}
int main() {
fi >> s;
fo << eval();
return 0;
}