Cod sursa(job #271704)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 5 martie 2009 20:38:46
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<string.h>

int n, i,a[100];
char p, e[2000];

void citire();
int EvalExpr(), EvalFactor(), EvalTermen();

int main(){
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    citire();
    scanf("%d\n",&n);
    for (; n; n--){
        scanf("%c", &p);
        a[p-'A'] = !a[p-'A'];
        i = 0;
        printf("%d",EvalExpr());
    }

    return 0;
}

void citire(){
    gets(e);
}

int EvalExpr(){

    if (e[i] == ' ') i++;

int r = EvalTermen(),t;

    if (e[i] == ' ') i++;

    while (strncmp(e+i,"OR", 2)==0 ){

        i += 2;
        r |= EvalTermen();

    }
    return r;
}

int EvalTermen(){
    if (e[i] == ' ') i++;

int r=EvalFactor();

    if (e[i] == ' ') i++;

    while (strncmp(e+i,"AND", 3)==0 ){

        i += 3;
        r &= EvalFactor();
    }
    return r;
}

int EvalFactor(){
    if (e[i] == ' ') i++;

int f;

    if (strncmp(e+i,"NOT", 3)==0 ){

        i += 3;
        f = ! EvalFactor();

    }
    else

        if (e[i] == '(' ){
            i++;
            f = EvalExpr();
            i++;
        }
        else

    if (strncmp(e+i,"TRUE", 4)==0 ){
        i += 4;
        f = 1;
    }
    else

        if (strncmp(e+i,"FALSE", 5)==0 ){
            i += 5;
            f = 0;
        }

        else

        f = a[e[i]-'A'], i++;

    return f;
}