Cod sursa(job #2789117)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 26 octombrie 2021 21:51:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#define MAX_LEVEL 2
#define NUL 320

char s[ 100000 ];
int f[ 255 ];
int poz;

int exp( int level );

int no() {
    if( f[ s[ poz ] ] == NUL )
        return 0;

    //printf( "%c\n", s[ poz ] );
    int no = 0;
    if( s[ poz ] == '(' ) {
        ++poz;
       // printf( "caca\n" );
        no = exp( 0 );
        ++poz;
    } else {
       // printf( "-> " );
        no = 0;
        while( f[ s[ poz ] ] == MAX_LEVEL )
            no = no * 10 + s[ poz++ ] - '0';
    }
    //printf( "%d\n", no );

    return no;
}

void modific( int& rez, char operatie, int level ) {
    if( f[ s[ poz ] ] == NUL )
        return;

    if( level == 0 )
        if( operatie == '+' )
            rez += exp( level + 1 );
        else rez -= exp( level + 1 );
    else if( level == 1 )
        if( operatie == '*' )
            rez *= exp( level + 1 );
        else rez /= exp( level + 1 );
    else rez += no();
}

int exp( int level ) {
    int rez = 0;

    if( f[ s[ poz ] ] == NUL )
        return 0;

    if( level < MAX_LEVEL )
        rez = exp( level + 1 );
    else rez = no();

    if( level < MAX_LEVEL )
        while( f[ s[ poz ] ] == level )
            modific( rez, s[ poz++ ], level );

    return rez;
}

int main()
{
    FILE *fin = fopen( "evaluare.in", "r" );
    fscanf( fin, "%s", s );
    fclose( fin );

    f[ '\0' ] = f[ ')' ] = NUL;
    f[ '+' ] = f[ '-' ] = 0;
    f[ '*' ] = f[ '/' ] = 1;
    for( int i = '0'; i <= '9'; i++ )
        f[ i ] = MAX_LEVEL;

    FILE *fout = fopen( "evaluare.out", "w" );
    fprintf( fout, "%d\n", exp( 0 ) );
    fclose( fout );
    return 0;
}