Cod sursa(job #1110090)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 17 februarie 2014 20:23:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cstring>

using namespace std;

class ExpressionSolver
{
    const int Hmax = 2;
    const char op[4][4] = { "+-", "*/", "^", "" };

    private:

        string expression;
        int point;

        int pw( int a, int p )
        {
            int r = 1;

            for ( int i = 0; ( 1 << i ) <= p; ++i )
            {
                if ( p & ( 1 << i ) )
                        r *= a;

                a *= a;
            }

            return r;
        }

        int operation( int a, int b, char o )
        {
            switch( o )
            {
                case '+': return a + b;
                case '-': return a - b;
                case '*': return a * b;
                case '/': return a / b;
                case '^': return pw( a, b );
            }
        }

        int termen()
        {
            int t = 0;

            if ( expression[ point ] == '(' )
            {
                point++;
                t = evaluate( 0 );
                point++;
            }
            else
            {
                while ( point < expression.size() && isdigit( expression[ point ] ) )
                {
                    t = t * 10 + expression[ point ] - '0';
                    point++;
                }
            }

            return t;
        }

    public:

        ExpressionSolver( string a )
        {
            expression = a;
            point = 0;
        }

        int evaluate( int level = 0 )
        {
            int t = 0;

            if ( level == Hmax )
                    t = termen();
            else
                    t = evaluate( level + 1 );

            while ( point < expression.size() && strchr( op[level], expression[ point ] )  )
            {
                t = operation( t, evaluate( level + 1 ), expression[ point++ ] );
            }

            return t;
        }
};

int main()
{
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");

    string s;

    f >> s;

    ExpressionSolver S( s );

    g << S.evaluate() << "\n";

    return 0;
}