Cod sursa(job #1898082)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 1 martie 2017 20:28:17
Problema Bool Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 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 = strlen( v );
        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;
    if( v[poz]=='!' ){
        poz++;
        return !exp_si();
    }

    else if( v[poz]=='(' ){
            poz++;
            exp = eval();
            poz++;
    }
    else{
        exp = val[ v[poz] - 'A' ];
        poz++;
    }
    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;
}