Cod sursa(job #763018)

Utilizator ericptsStavarache Petru Eric ericpts Data 30 iunie 2012 20:09:06
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <cstdio>
#include <string>
#include <fstream>

using namespace std;
std::string a;
long termen(string c,int &it,int * arg);
long factor(string c,int &it,int * arg);
long exeval(string c,int &it,int * arg)
{
    long r = termen(c,it,arg);
    while(c[it] == '+' || c[it] == '-')
    {
        if(c[it] == '+')
        {
            ++it;
            r+=termen(c,it,arg);
        }
        else if(c[it] == '-')
        {
            ++it;
            r-=termen(c,it,arg);
        }
    }
    return r;
}
long termen(string c,int &it,int * arg)
{
    long r = factor(c,it,arg);
    while(c[it] == '*' || c[it] == '/')
    {
        if(c[it] == '*')
        {
            ++it;
            r*=factor(c,it,arg);
        }
        else if(c[it] == '/')
        {
            ++it;
            r/=factor(c,it,arg);
        }
    }
    return r;
}
long factor(string c,int &it,int * arg)
{
    long r = 0;
    if(c[it] == '(')
    {
        ++it;
        r = exeval(c,it,arg);
        ++it;
    }
    else if(c[it] >= 'a' && c[it] <= 'z')
        r = arg[c[++it-1]-'a'];
    else
    {
        while(c[it] >= '0' && c[it] <= '9')
        {
            r = r*10 + c[it] - '0';
            ++it;
        }
    }
    return r;
}
int main()
{
    std::ifstream in("evaluare.in");
    in >> a;
    int arg[10];
    arg[0] = 5;
    arg[1] = 3;
    int it = 0;
    std::ofstream out("evaluare.out");
    out << exeval(a,it,arg);
    return 0;
}