Cod sursa(job #419865)

Utilizator iuly2freemanVasiliev Iulian iuly2freeman Data 18 martie 2010 08:49:31
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.45 kb
//#include <iostream>
#include <string>
#include <fstream>

using namespace std;

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

void init_expr(string &a)
{
    int len = a.length(), nested = 0;
    if (a[len - 1] == ')' && a[0] == '(')
    {
        int i;
        for (i = 0; i < len; ++i)
        {
            if (a[i] == '(') nested++;
            if (a[i] == ')') nested--;
            if (!nested && i != len - 1) break;
        }
        if (i == len)
        {
            a.erase(len - 1);
            a.erase(0, 1);
            init_expr(a);
            return;  
        }
    }
    if (a[0] == '+') a.erase(0, 1);
    if (a[0] == '-') a = '0' + a;   
}

int split_position(string a)
{
    int len = a.length(), nested = 0;
    for (int i = 0; i < len; ++i)
    {
        if (a[i] == '(') nested++;
        if (a[i] == ')') nested--;
        if (!nested && (a[i] == '+' || a[i] == '-')) return i; 
    } 
    for (int i = 0; i < len; ++i)
    {
        if (a[i] == '(') nested++;
        if (a[i] == ')') nested--;
        if (!nested && (a[i] == '*' || a[i] == '/')) return i; 
    }  
    return -1;
}

inline int get_sign_code(char a)
{
    if (a == '+') return 1;
    if (a == '-') return 2;
    if (a == '*') return 3;
    if (a == '/') return 4;
    return 0;
}

bool is_number(string a)
{
    int len = a.length();  
    for (int i = 0; i < len; ++i)
    {
        if (a[i] < '0' || a[i] > '9') return 0;
    }
    return 1;
}

int get_int(string a)
{
    int len = a.length(), nr = 0;  
    for (int i = 0; i < len; ++i)
    {
        nr = nr * 10;
        nr = nr + (a[i] - '0');
    }
    return nr;
}

int calc(int a, int b, int s)
{
    if (s == 1) return a + b;
    if (s == 2) return a - b;
    if (s == 3) return a * b;
    if (s == 4) return a / b; 
    return 0;  
}

int solve_expr(string a)
{
    init_expr(a); //cout << a << endl;
    if (is_number(a)) return get_int(a);
    string b = a;
    int pos = split_position(a);
    int sign = get_sign_code(a[pos]);
    a.erase(pos);
    b.erase(0, pos + 1);
    return calc(solve_expr(a), solve_expr(b), sign);   
}

int main()
{
    string a;
    cin >> a;
    string inm;
    inm = '*';
    for (unsigned int i = 0; i < a.length() - 1; ++i)
    {
        if (a[i] >= '0' && a[i] <= '9' && a[i+1] == '(')
        {
            a.insert(i + 1, inm);
        }
    }
    
    cout << solve_expr(a);
}