Cod sursa(job #2197723)

Utilizator LivcristiTerebes Liviu Livcristi Data 22 aprilie 2018 19:21:40
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define NUM 100005
char sir[NUM];
char aux[10];
int lng, i;
using namespace std;
int eval(char *a);
int EvaluareExpresie();
int EvaluareFactor();
int EvaluareTermen();
int e_cif(char a)
{
    if(a <= '9' && a >= '0')
        return 1;
    return 0;
}
int main()
{
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    f >> sir;
    lng = strlen(sir);
    aux[0] = 0;
    g << EvaluareExpresie();
    f.close();
    g.close();
}
int eval(char *a)
{
    int v = 0;
    for(int j = 0; j < strlen(a); ++j)
        v = v * 10 + a[j] - '0';
    return v;
}
int EvaluareFactor()
{
    int f = 0;
    if(sir[i] == '(')
    {
        i++;
        f = EvaluareExpresie();
        i++;
    }
    else
    {
        int j = 0;
        for( ; e_cif(sir[i]); ++i)
            aux[j++] = sir[i];
        aux[j] = 0;
        f = eval(aux);
        aux[0] = 0;
    }
    //cout << f << "\n";
    return f;
}
int EvaluareTermen()
{
    int f = EvaluareFactor();
    while(i < lng && (sir[i] == '*' || sir[i] == '/'))
    {
        if(sir[i] == '*')
        {
            i++;
            f *= EvaluareFactor();
        }
        else
        {
            i++;
            f /= EvaluareFactor();
        }
    }
    return f;
}
int EvaluareExpresie()
{

    int t = EvaluareTermen();
    //cout << t << " ";
    while(i < lng && (sir[i] == '+' || sir[i] == '-'))
    {
        if(sir[i] == '+')
        {
            i++;
            t += EvaluareTermen();
            //cout << t << "\n";
        }
        else
        {
            i++;
            t -= EvaluareTermen();
        }
    }
    //cout << t << "\n";
    return t;
}