Cod sursa(job #1810495)

Utilizator VasilescuVasilescu Eliza Vasilescu Data 20 noiembrie 2016 08:58:18
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

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

bool v[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;
    if(s[p] == '!')
    {
        ++p;
        return !factor();
    }
    if(s[p] == '(')
    {
        ++p;
        val = expresie();
        ++p;
        return val;
    }
    if(s[p] == '1')
    {
        ++p;
        return 1;
    }
    if(s[p] == '0')
    {
        ++p;
        return 0;
    }
    ++p;
    return v[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(si[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 c;
    char ch;
    scanf("%d\n",&ch);
    for(i=1; i<=c; ++i)
    {
        scanf("%c",&ch);
        v[ch - 'A'] = !v[ch - 'A'];
        p=0;
        printf("%d",expresie());
    }
    printf("\n");
    return 0;
}