Cod sursa(job #627361)

Utilizator crazzytudTudor Popa crazzytud Data 29 octombrie 2011 17:54:13
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>

bool expresie();
bool termen();
int operat();
bool non();
bool adv();
bool fals();
bool adun();

char *p,s[1002],f['Z'+5];

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int n,i; char z;
    gets(s);scanf("%d\n",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%c",&z);
        if(f[z]==false)
            f[z]=true;
        else    f[z]=false;
        p=s;

        if(expresie()==true)
        {
            printf("1");
            continue;
        }
        printf("0");
    }

    return 0;
}

bool expresie()
{
    bool x,y;
    x=adun();++p;
    while(operat()==2)
    {
        p+=3;
        y=termen();
        if(x||y)
            x=true;
        else x=false;
    }
    return x;

}


bool adun()
{
    bool x,y,ad;
    x=termen();++p;
    while(operat()==1)
    {
        p+=4;
        y=termen();
        if(x&y)
            x=true;
        else x=false;
    }
    return x;
}

bool termen()
{
    int semn=1;bool x;
    while(non())
    {
        semn*=-1;
    }
    if(*p=='(')
    {
        ++p;
        if(adv())
            return true;
        if(fals())
            return false;
        x=expresie();
        ++p;
        if((semn==1&&x==true)||(semn==-1&&x==false))
            return true;
        else return false;
    }
    ++p;
    x=f[*(p-1)];
    if((semn==1&&x==true)||(semn==-1&&x==false))
        return true;
    else return false;

}

int operat()
{
    if(*p=='A'&&*(p+1)=='N')
    {
        //p+=3;
        return 1;
    }
    if(*p=='O'&&*(p+1)=='R')
    {
        //p+=2;
        return 2;
    }
    return 0;
}

bool adv()
{
    if(*p=='T'&&*(p+1)=='R')
    {
        p+=4;
        return true;
    }
    return false;
}
bool fals()
{
    if(*p=='F'&&*(p+1)=='A')
    {
        p+=5;
        return true;
    }
    return false;
}


bool non()
{
    if(*p=='N'&&*(p+1)=='O')
    {
        p+=4;
        return true;
    }
    return false;
}