Cod sursa(job #273587)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 8 martie 2009 19:16:09
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>

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

bool EvalExpr(), EvalFactor(), EvalTermen();

int main(){
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    fgets(buf, 2000, stdin);
    for (i = 0, n = 0; buf[i] != '\n'; ++i)
        if ( buf[i] != ' ' )
            e[n++] = buf[i];

    for (i = 0; i < 'Z' - 'A' + 1; ++i)
         a[i] = 0;
    scanf("%d\n",&n);

    for (; n; n--){
        scanf("%c", &p);
        a[p-'A'] = 1-a[p-'A'];
        i = 0;
        printf("%d",(EvalExpr()) ? 1 : 0);
    }
    printf("\n");

    return 0;
}

bool EvalExpr(){

bool r = EvalTermen();

    while (e[i]=='O'&& e[i+1] == 'R'){

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

    }
    return r;
}

bool EvalTermen(){

bool r = EvalFactor();

    while (e[i] == 'A' && a[i+1] == 'N'){

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

bool EvalFactor(){

bool f;

    if (e[i] == 'N' && e[i+1] == 'O'){

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

    }
    else

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

    if (e[i] == 'T' && e[i+1] == 'R'){
        i += 4;
        return 1;
    }
    else

        if (e[i] == 'F' && e[i+1] == 'A'){
            i += 5;
            return 0;
        }

        else
    {
        f = a[e[i]-'A'];
        i++;
    }
    return f;
}