Cod sursa(job #2696143)

Utilizator cipri321Marin Ciprian cipri321 Data 15 ianuarie 2021 14:03:34
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
	
#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;
}