Pagini recente » Cod sursa (job #2487644) | Cod sursa (job #1785673) | Cod sursa (job #1511095) | Cod sursa (job #2404583) | Cod sursa (job #2406739)
#include <fstream>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
#define lenMax 100005
char Expresie[lenMax], *p = Expresie;
long termen();
long factor();
long eval();
int main(){
//Citire din fisier
fin.getline(Expresie, lenMax);
//Rezolvare si scriere in fisier
fout << eval();
fin.close();
fout.close();
return 0;
}
/*
*Functia eval() va "aduna" toti termenii unei expresii / subexpresii (paranteza)
*/
long eval(){
long rezultat = termen();
while( *p == '+' || *p == '-' ){
switch ( *p ){
case '+' :
++p;
rezultat += termen();
break;
case '-' :
++p;
rezultat -= termen();
break;
}
}
return rezultat;
}
/*
* Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
* lui din factori inmultiti.
*/
long termen(){
long rezultat = factor();
while( *p == '*' || *p == '/' ){
switch ( *p ){
case '*' :
++p;
rezultat *= factor();
break;
case '/' :
++p;
rezultat /= factor();
break;
}
}
return rezultat;
}
/*
* Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
* sau un numar natural
*/
long factor(){
long rezultat = 0;
if ( *p == '(' ){ //In cazul unei subexpresii (paranteza)
++p; //Trece peste '('
rezultat = eval(); //Calculeaza subexpresia pe care o va returna ulterior
++p; //Trece peste ')'
}else{
while( *p >= '0' && *p <= '9'){ //In cazul unui numar, returneaza numarul
rezultat = rezultat * 10 + *p - '0';
++p;
}
}
return rezultat;
}