Cod sursa(job #1496099)

Utilizator usermeBogdan Cretu userme Data 4 octombrie 2015 13:15:23
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>

FILE*f=fopen("bool.in","r");
FILE*h=fopen("bool.out","w");

int n,p;

bool v[501];

char s[2010],c;

void advance(){
    while(s[p]==' '){
        ++p;
    }
}

bool expresie();

bool element(){
    bool k=0;
    advance();
    if ( s[p]=='(' ) {
        ++p;
        advance();
        k = expresie();
        advance();
        ++p;
    } else {
        if ( s[p]=='T'&&s[p+1]=='R' ){p+=4;advance();k=1;}
            else
                if ( s[p]=='F'&&s[p+1]=='A'){p+=5;advance();k=0;}
                    else
                        if ( s[p]=='N'&&s[p+1]=='O' )
                            {p+=3;
                            advance();
                            bool tmp=element();
                            k=(!tmp);
                            advance();
                            }
                            else {k=v[s[p]];advance();p+=1;}
    }
    return k;
}


bool termen(){
    bool b=element();
    advance();
    while ( s[p]=='A'&&s[p+1]=='N' ){
            p+=3;
            advance();
            bool tmp = element();
            b=(b&&tmp);
            advance();
        }
    return b;
}

bool expresie(){
    bool b=termen();
    advance();
    while ( s[p]=='O'&&s[p+1]=='R' ){
        advance();
        p+=2;
        advance();
        bool tmp = termen();
        b=(b||tmp);
        advance();
    }
    return b;
}

int main()
{
    fgets(s,2010,f);
    fscanf(f,"%d\n",&n);
    for ( int i=1;i<=500;++i )
        v[i]=0;
    for ( int i=1;i<=n;++i ){
        p=0;
        fscanf(f,"%c",&c);
        v[c]=!v[c];
        fprintf(h,"%d",expresie());
    }
    return 0;
}