Cod sursa(job #3005705)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 17 martie 2023 10:20:30
Problema Evaluarea unei expresii Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.75 kb
#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;
}