Cod sursa(job #1818472)

Utilizator ioanadragomirIoana Dragomir ioanadragomir Data 29 noiembrie 2016 12:04:42
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=1010;
char s[N], op[101];
int p;
bool v[26];

bool expresie();
bool termen();
bool factor();

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

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

bool factor()
{
    bool semn=true,val;
    while(s[p]=='!')
    {
        p++;
        semn=(!semn);
    }
    if(s[p]=='(')
    {
        p++;
        val=expresie();
        p++;
        if (semn) return val;
        return !val;
    }
    val=v[s[p]-'A'];
    p++;
    if (semn) return val;
    return !val;
}

int main()
{
    int n,k=0,i;
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(s);
    scanf("%d\n",&n);
    gets(op);
    for(i=0; s[i]; i++)
    {
        if(s[i]=='T'&&s[i+1]=='R')
        {
            s[k++]='1';
            i+=3;
        }
        else if(s[i]=='F'&&s[i+1]=='A')
        {
            s[k++]='0';
            i+=4;
        }
        else if(s[i]=='O'&&s[i+1]=='R')
        {
            s[k++]='|';
            i++;
        }
        else if(s[i]=='A'&&s[i+1]=='N')
        {
            s[k++]='&';
            i+=2;
        }
        else if(s[i]=='N'&&s[i+1]=='O')
        {
            s[k++]='!';
            i+=2;
        }
        else if(s[i]!=' ')
            s[k++]=s[i];
    }
    s[k++]='\0';

    for(i=0; i<n; i++)
    {
        p=0;
        v[op[i]-'A'] = (!v[op[i]-'A']);
        printf("%d",expresie());
    }
    return 0;
}