Cod sursa(job #1066280)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 24 decembrie 2013 14:26:28
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include <cstring>

using namespace std;

int i,n,k,t;
char s[1005];
char ch;
bool ok[200];

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

bool expresie()
{
    bool r=termen();
    while(s[i]=='|')
    {
        i++;
        if(r || termen())
            r=1;
        else
            r=0;
    }
    return r;
}

bool termen()
{
    bool r=factor();
    while(s[i]=='&')
    {
        i++;
        if(r && factor())
            r=1;
        else
            r=0;
    }
    return r;
}

bool factor()
{
    bool r;
    if(s[i]=='(')
    {
        i++;
        r=expresie();
        i++;
    }
    else
    if(s[i]=='!')
    {
       k=0;
       while(s[i]=='!'){
            i++;k++;
       }
       if(s[i]=='(')
          {
              i++;
              bool rr=expresie();
              if(k%2==0)
                r=rr;
                else
                if(rr==1)
                    r=0;
                else
                    r=1;
            i++;
          }
        else
        {
            bool rr=ok[s[i]-'A'];
            if(k%2==0)
                r=rr;
                else
                if(rr==1)
                    r=0;
                else
                    r=1;
            i++;
        }
    }
    else
    {
        r=ok[s[i]-'A'];
    }
    return r;
}

int main()
{
    ifstream f("bool.in");
    ofstream g("bool.out");
    f.get(s,1005);
    for(i=0;s[i]!=0;i++)
    {
        if(s[i]=='T' && s[i+1]=='R')
        {
            s[i]='1';
            strcpy(s+i+1,s+i+4);
        }
        else
        if(s[i]=='F' && s[i+1]=='A')
        {
            s[i]='0';
            strcpy(s+i+1,s+i+5);
        }
        else
        if(s[i]=='O' && s[i+1]=='R')
        {
            s[i]='|';
            strcpy(s+i+1,s+i+2);
        }
        else
        if(s[i]=='A' && s[i+1]=='N')
        {
            s[i]='&';
            strcpy(s+i+1,s+i+3);
        }
        else
        if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            s[i]='!';
            strcpy(s+i+1,s+i+3);
        }
    }
    for(i=0;s[i]!=0;i++)
        if(s[i]==' ')
        {
            strcpy(s+i,s+i+1);
        }
    f.get();
    f>>n;
    f.get();
    for(t=1;t<=n;t++)
    {
        f>>ch;
        i=0;
        if(ok[ch-'A'])
            ok[ch-'A']=0;
        else
            ok[ch-'A']=1;
        if(expresie())
            g<<'1';
        else
            g<<'0';
    }
    f.close();g.close();
    return 0;
}