Cod sursa(job #1375391)

Utilizator darrenRares Buhai darren Data 5 martie 2015 13:08:03
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

char A[100002];

int eval_a(int &x);
int eval_b(int &x);

int getnum(int &x)
{
    int num = 0;
    while (A[x] >= '0' && A[x] <= '9')
    {
        num = num * 10 + (A[x] - '0');
        ++x;
    }
    return num;
}
int eval_a(int &x) // expression
{
    int result = 0, sign = 1;
    while (true)
    {
        if (A[x] == ')' || A[x] == 0)
        {
            if (A[x] == ')') ++x;
            break;
        }
        if (A[x] == '+' || A[x] == '-')
        {
            if (A[x] == '-') sign = -sign;
            ++x;
        }
        else
        {
            result += sign * eval_b(x);
            sign = 1;
        }
    }
    return result;
}
int eval_b(int &x) // term
{
    int result = 1, sign = 1;
    while (true)
    {
        if (A[x] == ')' || A[x] == '+' || A[x] == '-' || A[x] == 0)
            break;
        if (A[x] == '(')
        {
            ++x;
            if (sign == 1) result *= eval_a(x);
            else           result /= eval_a(x);
            sign = 1;
        }
        else if (A[x] == '*' || A[x] == '/')
        {
            if (A[x] == '/') sign = -sign;
            ++x;
        }
        else
        {
            if (sign == 1) result *= getnum(x);
            else           result /= getnum(x);
            sign = 1;
        }
    }
    return result;
}

int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");

    fin.getline(A, 100002);

    int r = 0;
    fout << eval_a(r) << '\n';

    fin.close();
    fout.close();
}