Cod sursa(job #2700956)

Utilizator Albert_GAlbert G Albert_G Data 29 ianuarie 2021 13:38:55
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>

using namespace std;

ifstream cin("bool.in");
ofstream cout("bool.out");

const int NOP =101,LE=1001,NL=26;///nr operatii,lungime expresie, nr litere
char s[LE],op[NOP];
bool val[NL];
int index=0;

void transforma();
bool expresie();
bool termen();
bool factor();

void transforma()
{
    int nr=0,i=0;
    while(s[i]!='\0')
    {
        if(s[i]=='T' && s[i+1]=='R')
        {
            s[nr++]='1';
            i+=4;
        }
        else if(s[i]=='F' && s[i+1]=='A')
        {
            s[nr++]='0';
            i+=5;
        }
        else if(s[i]=='N' && s[i+1]=='O')
        {
            s[nr++]='!';
            i+=3;
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            s[nr++]='|';
            i+=2;
        }
        else if(s[i]=='A' && s[i+1]=='N')
        {
            s[nr++]='&';
            i+=3;
        }
        else if(s[i]!=' ')
        {
            s[nr++]=s[i++];
        }
        else ++i;

    }
    s[nr]='\0';
}

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

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

bool factor()
{
    bool nu = false,v;
    while(s[index]=='!')
    {
        ++index;
        nu = (!nu);
    }
    if(s[index] == '(' )
    {
        ++index;
        v=expresie();
        ++index;
        if(nu)
        {
            return !v;
        }
        return v;
    }
    if(s[index]=='0')
    {
        ++index;
        v=false;
    }
    else if(s[index]=='1')
    {
        ++index;
        v=true;
    }
    else
    {
        v = val[s[index++]-'A'];
    }
    if(nu) return !v;
    return v;

}

int main()
{
    cin.getline(s,LE);
    transforma();
    int n;
    cin>>n>>op;
    for(int i=0;i<n;++i)
    {
        val[op[i]-'A']=(!val[op[i]-'A']);
        index=0;
        cout<<expresie();
    }
    return 0;
}