Pagini recente » Cod sursa (job #249308) | Cod sursa (job #1077120) | Cod sursa (job #3031966) | Cod sursa (job #2844822) | Cod sursa (job #2696143)
#include <fstream>
#include <stack>
#include <string>
#include <map>
#define DIM 100005
using namespace std;
ifstream fi("evaluare.in");
ofstream fo("evaluare.out");
char exp[DIM], *p=exp;
map<char, int> OP;
void initOP();
bool op(char c);
int ordin(char c);
int efectueaza(int a, int b, char op);
int eval();
int termen();
int factor();
int main()
{
fi>>exp;
initOP();
fo<<eval();
fi.close();
fo.close();
return 0;
}
void initOP()
{
OP['+']=1, OP['-']=1, OP['*']=2, OP['/']=2;
}
// functie care verifica daca un caracter este sau nu operator
bool op(char c)
{
return OP.find(c)!=OP.end();
}
// functie care intoarce ordinul unui operator
// parameters: c - char {+, -, *, /}
int ordin(char c)
{
return OP[c];
}
// functie care efectueaza operatia in functie de un operator dat
int efectueaza(int a, int b, char op)
{
if (op == '+') return a+b;
else if (op == '-') return a-b;
else if (op == '*') return a*b;
else return a/b;
}
// evaluam o expresie in forma infixa in mod intuitiv,
// adica o separam pe termeni(expresie separata de operatori cu precedenta minima -> +-)
// apoi in factori(expresie separata de operatori cu precedenta maxima -> */)
// ramanem cu constante sau paranteze(le evaluam ca pe expresii de sine-statatoare)
int eval()
{
int res=termen();
while(op(*p) && ordin(*p)==1)
{
char aux = *p;
p++;
res=efectueaza(res, termen(), aux);
}
return res;
}
// evaluam un termen, expresie constituita din operanzi, operatori(*/) si expresii in ()
int termen()
{
int res=factor();
while(op(*p) && (ordin(*p) == 2))
{
char aux = *p;
p++;
res=efectueaza(res, factor(), aux);
}
return res;
}
// evaluam un factor
int factor()
{
int res=0;
if ( *p == '(' )
{
p++; // pt (
res = eval();
p++; // pt )
}
else
{
while ( *p>='0' && *p<='9' )
{
res = res*10 + (*p - '0');
p++;
}
}
return res;
}