Cod sursa(job #1496603)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 5 octombrie 2015 11:41:14
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#define MAXN 1000
int val[26], p;
char s[MAXN+10];
int expresie();
int termen();
int factor();
int factor(){
    int x=0, f=1;
    if((s[p]=='N')&&(s[p+1]=='O')&&(s[p+2]=='T')){
        f=0;
        p+=3;
    }
    if(s[p]=='('){
        p++;
        x=expresie();
        p++;
    }else if((s[p]=='T')&&(s[p+1]=='R')&&(s[p+2]=='U')&&(s[p+3]='E')){
        p+=4;
        x=1;
    }else if((s[p]=='F')&&(s[p+1]=='A')&&(s[p+2]=='L')&&(s[p+3]=='S')&&(s[p+4]=='E')){
        p+=5;
        x=0;
    }else{
        x=val[s[p]-'A'];
        p++;
    }
    return (x==f);
}
int termen(){
    int x=factor();
    while((s[p]=='A')&&(s[p+1]=='N')&&(s[p+2]=='D')){
        p+=3;
        x&=factor();
    }
    return x;
}
int expresie(){
    int x=termen();
    while((s[p]=='O')&&(s[p+1]=='R')){
        p+=2;
        x|=termen();
    }
    return x;
}
int main(){
    int n, q, i;
    char ch;
    FILE *fin, *fout;
    fin=fopen("bool.in", "r");
    fout=fopen("bool.out", "w");
    ch=fgetc(fin);
    n=0;
    while(ch!='\n'){
        if(ch!=' '){
            s[n++]=ch;
        }
        ch=fgetc(fin);
    }
    fscanf(fin, "%d ", &q);
    for(i=0; i<q; i++){
        ch=fgetc(fin);
        val[ch-'A']=(val[ch-'A']==0);
        p=0;
        fprintf(fout, "%d", expresie());
    }
    fclose(fin);
    fclose(fout);
    return 0;
}