Pagini recente » Cod sursa (job #1556244) | Cod sursa (job #1263540) | Cod sursa (job #1571551) | Cod sursa (job #1055263) | Cod sursa (job #1110091)
#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;
unsigned 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;
}