Cod sursa(job #2268258)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 24 octombrie 2018 16:58:26
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>
#include <cstdlib>

#define FILE_IN "bool.in"
#define FILE_OUT "bool.out"

char Exp[1024];
int N;
bool Var[26];
char *p;

bool Factor();
bool Termen();
bool Eval();

int main()
{
    freopen(FILE_IN, "r", stdin);
    freopen(FILE_OUT, "w", stdout);

    fgets(Exp, 1024, stdin);
    scanf("%i", &N);

    while(N--)
    {
        char x;
        scanf(" %c", &x);
        Var[x - 'A'] = !Var[x - 'A'];
        p = Exp;
        printf("%i", Eval());
    }

    return 0;
}

bool Factor()
{
    while(*p == ' ') ++p;
    bool r = false;
    if(*p == '(')
    {
        ++p;
        r = Eval();
        ++p;
    }
    else
    {
        if(*(p+1) == ' ' || *(p+1) == ')' || *(p+1) == '\n')
        {
            r = Var[*p - 'A'];
            ++p;
        }
        else
        {
            if(*p == 'N')
            {
                p += 3;
                r = 1 - Factor();
            }
            else if(*p == 'T')
            {
                p += 4;
                r = true;
            }
            else if(*p == 'F')
            {
                p += 5;
                r = false;
            }
            else
                exit(-1);
        }
    }
    return r;
}

bool Termen()
{
    bool r = Factor();

    while(*p == ' ') ++p;
    while(*p == 'A')
    {
        if(*p == 'A')
        {
            p += 3;
            r &= Factor();
        }
        while(*p == ' ') ++p;
    }
    return r;
}

bool Eval()
{
    bool r = Termen();
    while(*p == 'O')
    {
        if(*p == 'O')
        {
            p += 2;
            r |= Termen();
        }
        while(*p == ' ') ++p;
    }
    return r;
}