Cod sursa(job #1898032)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 1 martie 2017 20:06:07
Problema Bool Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char v[1000];
char val[28];
FILE *fin, *fout;

void citire_sir(){
    int poz;
    char ch;
    fscanf( fin, "%s", v );
    ch = fgetc( fin );
    poz = 0;
    val[26] = 1;///codificam true ca z+1 si false ca z+2
    while( ch!='\n'){
        while( v[poz]=='(' || v[poz]==')' )
            poz++;
        if( strcmp( v+poz, "TRUE")==0 ){
            v[poz] = 'Z'+1;
            v[poz+1] = 0;
        }
        else if( strcmp( v+poz, "FALSE") == 0 ){
            v[poz] = 'Z'+2;
            v[poz+1] = 0;
        }
        else if( strcmp( v+poz, "NOT" ) == 0 ){
            v[poz] = '!';
            v[poz+1] = 0;
        }
        else if( strcmp( v+poz, "OR" ) == 0 ){
            v[poz] = '|';
            v[poz+1] = 0;
        }
        else if( strcmp( v+poz, "AND" ) == 0 ){
            v[poz] = '&';
            v[poz+1] = 0;
        }
        poz += 1 + strlen( v+poz+1 );
        fscanf( fin, "%s", v+poz );
        ch = fgetc( fin );
    }
}

int poz;

int eval();
int exp_sau();
int exp_si();

int eval(){
    int exp = exp_sau();
    while( v[poz]=='&' ){
        poz++;
        exp = exp & exp_sau();
    }
    return exp;
}

int exp_sau(){
    int exp = exp_si();
    while( v[poz]=='|' ){
        poz++;
        exp = exp | exp_si();
    }
    return exp;
}

int exp_si(){
    int exp, not1, not2, exp2;
    exp = exp2 = 0;
    not1 = not2 = 0;
    if( v[poz]=='!' ){
        not1 = 1;
        poz++;
    }
    if( isalpha( v[poz] ) != 0 ){
        exp = val[ v[poz] - 'A' ];
        poz++;
    }
    else if( v[poz]=='(' ){
            poz++;
            exp = eval();
            poz++;
    }
    if( not1==1 )
        exp = 1 - exp;
    while( v[poz] == '&' ){
        poz++;
        if( v[poz]=='!' ){
            not2 = 1;
            poz++;
        }
        else
            not2 = 0;

        if( isalpha( v[poz] ) !=0 ){
            exp2 = val[ v[poz] - 'A' ];
            poz++;
        }
        else if( v[poz]=='(' ){
            poz++;
            exp2 = eval();
            poz++;
        }
        if( not2==1 )
            exp2 = 1 - exp2;
        exp = exp & exp2;
    }
    return exp;
}

int main(){
    int n, i;
    char ch;
    fin = fopen( "bool.in", "r" );
    fout = fopen( "bool.out", "w" );
    citire_sir();
    fscanf( fin, "%d\n", &n );
    //printf("%s",v);
    for( i=0; i<n; i++ ){
        ch = fgetc( fin );
        val[ ch - 'A' ] = 1 - val[ ch - 'A' ];
        poz = 0;
        fprintf( fout, "%d", eval() );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}