Cod sursa(job #1595705)

Utilizator andreiskiorAndrei Cristian Nastase andreiskior Data 10 februarie 2016 14:53:40
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int expresie();
int termen();
int factor();

bool vc[26];
char si[1000];
char s[1000];
int p;

int expresie()
{
    int val = termen();
    while( s[p] == '|')
    {
            ++p;
            val |= termen();
    }
    return val;
}

int termen()
{
    int val = factor();
    while(s[p] == '&')
    {
            ++p;
            val &= factor();
    }
    return val;
}

int factor()
{
    int val = 0, _not = 0;
    if(s[p] == '!')
        {
            ++p;
            _not = 1;
        }
    if(s[p] == '(')
    {
        ++p;
        val = expresie();
        ++p;
        if(_not == 1)
            return !val;
        return val;
    }
    if(s[p] == '1')
    {
        ++p;
        if(_not == 1)
            return 0;
        return 1;
    }
    if(s[p] == '0')
    {
        ++p;
        if(_not == 1)
            return 1;
        return 0;
    }
    ++p;
    if(_not == 1)
        return !vc[s[p-1] - 'A'];
    return vc[s[p-1] - 'A'];
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int n,i,l,k=0;
    gets(si);
    l = strlen(si);
    for(i=0; i<l; ++i)
    {
        if(!isspace(s[i])){
        if(si[i] >= 'A' && si[i] <= 'Z')
        {
            if(si[i] == 'A' && si[i+1] == 'N')
            {
                s[k++] = '&';
                i+=2;
            }
            else
                if(si[i] == 'O' && si[i+1] == 'R')
            {
                s[k++] = '|';
                i++;
            }
            else
                if(si[i] == 'N' && si[i+1] == 'O')
            {
                s[k++] = '!';
                i+=2;
            }
            else if(si[i] == 'T' && si[i+1] == 'R')
            {
                s[k++] = '1';
                i+=3;
            }
            else if(si[i] == 'F' && si[i+1] == 'A')
            {
                s[k++] = '0';
                i+=4;
            }
            else
            {
                s[k++] = si[i];
            }
        }
        else
            if(si[i] == '(' || si[i] == ')')
                s[k++] = si[i];
        }
    }
    s[k] = '\0';
    int ch;
    char chc;
    scanf("%d\n",&ch);
    for(i=1; i<=ch; ++i)
    {
        scanf("%c",&chc);
        vc[chc - 'A'] = !vc[chc - 'A'];
        p=0;
        printf("%d ",expresie());
    }
    printf("\n");
    return 0;
}