Pagini recente » Cod sursa (job #1265117) | Cod sursa (job #2846926) | Cod sursa (job #2054357) | Cod sursa (job #1281475) | Cod sursa (job #3005705)
#include <fstream>
#include <stack>
#include <cstring>
#include <string>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char a [ 100005] ;
char t [ 100005 ] ;
char rezid [ 100005 ];
long long eval(char rezid[])
{
int semn = 1 ;
long long val = 0;
long long sum = 0 ;
long long l = strlen ( rezid );
for ( int i = 0 ; i < l ; i ++ )
{
if ( isdigit ( rezid [ i ] ) == true )
{
val = val * 10 + rezid [ i ] - '0';
}
else
{
sum += val * semn ;
if ( rezid [ i ] == '-')
semn = -1 ;
else
semn = 1 ;
if ( rezid [ i - 1 ] == '-')
{
semn *= -1 ;
}
val = 0 ;
}
}
sum += val * semn ;
return sum ;
}
long long rezolv(char rezid[ ])
{
int l = strlen( rezid ) ;
for ( int i = 0 ; i < l ; i ++ )
{
if ( rezid [ i ] == '*' || rezid [ i ] == '/')
{
int dr = 0 ;
int st = 0 ;
long long val1 = 0;
long long val2= 0 ;
long long q = i + 1;
if ( isdigit( rezid [ q ] ) == false )
q ++ ;
for ( int j = q ; j < l ; j ++ )
{
if ( isdigit ( rezid [ j ] ) == true )
{
dr = j ;
val1 = val1 * 10 + rezid [ j ] - '0';
}
else
break ;
}
if ( rezid [ i + 1] == '-' )
val1 = -val1 ;
string f ;
for ( int j = i - 1; j >= 0 ; j -- )
{
if ( isdigit(rezid [ j ]) == true )
{
st = j ;
f += rezid [ j] ;
}
else
break ;
}
for ( int j = f.size() - 1 ; j >= 0 ; j -- )
val2 = val2 * 10 + f [ j ] - '0';
if ( st >= 2 && rezid [ st - 1 ] == '-' && (rezid [ st - 2 ] == '-' || rezid [ st - 2 ] == '+'))
{
val2 = -val2 ;
st -- ;
}
long long x ;
if ( rezid [ i ] == '*')
x = val1 * val2 ;
else
{
if ( val1 != 0 && val2 != 0 )
x = val2 / val1 ;
else
x = 0 ;
}
string m;
m += to_string(x);
strcpy(t, m.c_str() );
strcpy(t+m.size(), rezid + dr + 1);
strcpy(rezid + st, t );
strcpy ( rezid + st, t );
t[ 0 ] = '\0';
i = st - 1 ;
l = strlen( rezid ) ;
}
}
long long x = eval(rezid);
return x ;
}
int main()
{
stack<int> s ;
cin >> a;
int l = strlen( a ) ;
for ( int i = 0 ; i < l ; i ++ )
{
if ( a [ i ]== '(')
s.push(i);
else if ( a[ i ] == ')')
{
strcpy( rezid, a + s.top() + 1 );
strcpy( rezid + ( i - s.top() - 1 ), "\0") ;
long long val = rezolv ( rezid ) ;
string f = to_string(val);
rezid [ 0 ] = '\0';
strcpy(t,f.c_str());
strcpy(t + f.size(),a + i + 1) ;
strcpy( a + s.top(), t );
t [ 0 ] = '\0';
i = s.top() - 1 ;
s.pop();
}
l = strlen(a);
}
cout << rezolv(a) << '\n';
return 0;
}