Cod sursa(job #2547238)

Utilizator sipdavSipos David Oliver sipdav Data 15 februarie 2020 10:22:00
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");

const int dim = 100005;

int current;
char a[dim];

int evaluare();
int termen();
int factor();

bool isOp1(char c)
{
    return (c == '+' || c == '-');
}


bool isOp2(char c)
{
    return (c == '*' || c == '/');
}

bool isDigit(char c)
{
    if(c >= '0' && c <='9')
        return true;
    return false;
}

int getSign(char c)
{
    if(c == '-')
        return -1;
    else if(c == '+')
        return 1;
    return 0;
}

int getDigit(char c)
{
    return c - '0';
}

int evaluare()
{
    int rez = termen(), sign = 0;
    while((sign = getSign(a[current])) != 0)
    {
        current++;
        rez += sign * termen();
    }
    return rez;
}

int termen()
{
    int rez = factor();
    while(isOp2(a[current]))
    {
        if(a[current] == '*')
            current++, rez *= factor();
        else if(a[current] == '/')
            current++, rez /= factor();
    }
    return rez;
}

int factor()
{
    int rez = 0, sign = 1;
    while(a[current] == '-')
    {
        current++;
        sign *= -1;
    }

    if(a[current] == '(')
    {
        current++;
        rez = evaluare();
        current++;
        return rez * sign;
    }

    while(isDigit(a[current]))
    {
        rez = rez * 10 + getDigit(a[current]);
        current++;
    }

    return rez * sign;
}

int main()
{
    cin>>a;
    int rez = evaluare();
    //cout<<a;
   cout<<rez;
    return 0;
}