Cod sursa(job #1143331)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 15 martie 2014 14:54:56
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#define MAXN 1001
#define MAXVAR 27

char s[MAXN];
bool type[MAXVAR];
int poz;

bool expr();
bool term();
bool fact();

bool expr( ) {
    bool x = term();
    while( s[poz] == 'O' && s[poz+1] == 'R' ) {
        poz += 2;
        if( s[poz] == ' ' )
            ++poz;
        x = x | term();
    }
    return x;
}

bool term( ) {
    bool x = fact();
    while( s[poz] == 'A' && s[poz+1] == 'N' && s[poz+2] == 'D' ) {
        poz += 3;
        if( s[poz] == ' ' )
            ++poz;
        x = x & fact();
    }
    return x;
}

bool fact() {
    bool x, tild = false;
    if( s[poz] == 'N' && s[poz+1] == 'O' ) {
        tild = true;
        poz += 3;
        if( s[poz] == ' ' )
            ++poz;
    }
    if( s[poz] == '(' ) {
       ++poz;
       x = expr();
    }
    else if( s[poz] == 'T' && s[poz+1] == 'R' ) {
        x = true;
        poz += 4;
        if( s[poz] == ' ' )
            ++poz;
    }
    else if( s[poz] == 'F' && s[poz+1] == 'A' ) {
        x = false;
        poz += 5;
        if( s[poz] == ' ' )
            ++poz;
    }
    else {
        x = type[s[poz]-'A'];
        ++poz;
        if( s[poz] == ' ' )
            ++poz;
    }
    if( tild )
        x = 1 - x;
    return x;
}

int main () {
    FILE *f, *g;
    f = fopen( "bool.in", "r" );
    g = fopen( "bool.out", "w" );

    int n;
    char c;

    fgets( s, MAXN, f );
    fscanf( f, "%d", &n );
    c = fgetc( f );

    for( int i = 0 ; i < n ; ++i ) {
        c = fgetc( f );
        type[c-'A'] = 1 - type[c-'A'];
        poz = 0;
        fprintf( g, "%d", expr() );
    }

    fclose( f );
    fclose( g );
    return 0;
}