Cod sursa(job #2643247)

Utilizator adiaioanaAdia R. adiaioana Data 19 august 2020 12:11:52
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda prbd1 Marime 2.16 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
char *p, str[1010],aux[1010],ch,val[100];
bool ans;
int N;
void cifru();
bool eval();
bool termen();
bool factor();
int main()
{
    cin.getline(str,1001);
    N=strlen(str);
    cifru();
    ///scot spatiile si inlocuiesc cuvintele enervante
    //cout<<str<<'\n';
    int nr;
    cin>>nr;
    while(nr--)
    {
        cin>>ch;
        val[ch-'A']=1-val[ch-'A'];
        ans=1;
        p=str;
        ans=eval();
        cout<<ans;
    }
    return 0;
}

void cifru()
{
    int k=0;
    for(int i=0; i<N; ++i)
        if(str[i]=='A' && str[i+1]=='N')
        {
            aux[k++]='&';
            aux[k]='\0';
            i+=2;
        }
        else if(str[i]=='O'&&str[i+1]=='R')
        {
            aux[k++]='|';
            aux[k]='\0';
            ++i;
        }
        else if(str[i]=='N'&&str[i+1]=='O')
        {
            aux[k++]='!';
            aux[k]='\0';
            i+=2;
        }
        else if(str[i]=='T' && str[i+1]=='R')
        {
            aux[k++]='1';
            aux[k]='\0';
            i+=3;
        }
        else if(str[i]=='F'&&str[i+1]=='A')
        {
            aux[k++]='0';
            aux[k]='\0';
            i+=4;
        }
        else if(str[i]!=' ')
        {
            aux[k++]=str[i];
            aux[k]='\0';
        }
    str[0]='\0';
    strcpy(str,aux);
    N=strlen(str);
}

bool factor()
{
    bool r;
    if(*p=='(')
    {
        p++;
        r=eval();
        p++;
        return r;
    }
    else if(*p=='!')
    {
        p++;
        r=1-factor();
        return r;
    }
    else if(isdigit(*p))
    {
        r=(*p-'0');
        ++p;
        return r;
    }
    else {
        r=val[*p-'A'];
        ++p;
        return r;
    }
}

bool termen()
{
    bool r=factor(), q;
    if(*p=='&')
    {
        p++;
        q=termen();
        r=r&q;
    }
    return r;
}

bool eval()
{
    bool r=termen(), q;
    if(*p=='|')
    {
        p++;
        q=termen();
        r=r|q;
    }
    return r;
}