Pagini recente » Cod sursa (job #1876842) | Cod sursa (job #1719610) | Cod sursa (job #400955) | Cod sursa (job #633105) | Cod sursa (job #2331360)
#include <fstream>
using namespace std;
const long MAX = 100010;
char S[MAX], *p=S;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
long termen();
long factor();
int numar()
{int nr=0;
while ( *p>='0' && *p<='9' ) { // avem un numar
nr = nr*10 + (*p - '0');
++p;
}
return nr;
}
/*
* 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 // avem un numar
r = numar();
return r;
}
int main() {
f.get(S, MAX);
g<<eval();
return 0;
}