Cod sursa(job #2539909)

Utilizator adiaioanaAdia R. adiaioana Data 6 februarie 2020 15:08:35
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
char expr[1010], ch, *p;
bool val[30];
void skipspace();
bool nr();
bool eval();
bool termen();
bool factor();
int main()
{
    int N;
    ios_base :: sync_with_stdio (false);
    cin.tie(NULL);
    cin.getline(expr,100001);
    strcat(expr,"  ");
    cin>>N;
    for(int i=1; i<=N; ++i)
    {
        p=expr;
        cin>>ch;
        val[ch-'A']=!val[ch-'A'];
        cout<<eval();
    }
    return 0;
}

bool eval()
{
    bool r=termen();
    skipspace();
    while(*p=='O' && *(p+1)=='R')
    {
        p+=2;
        skipspace();
        r=r|termen();
    }
    return r;
}

bool termen()
{
    bool r=factor();
    skipspace();
    while(*p=='A' && *(p+1)=='N'&&*(p+2)=='D')
    {
        p+=3;
        skipspace();
        r=r&termen();
    }
    return r;
}

bool factor()
{
    bool r=0;
    skipspace();
    if(*p=='(')
    {
        ++p;
        skipspace();
        r=eval();
        ++p;
        skipspace();
    }
    else if((*p=='N' && *(p+1)=='O'&&*(p+2)=='T') || isalpha(*p))
        r=nr();
    return r;
}

bool nr()
{
    bool r;
    skipspace();
    if(*p=='N' && *(p+1)=='O'&&*(p+2)=='T')
    {
        p+=3;
        skipspace();
        r=!(factor());
    }
    else if(isalpha(*p)){
        r=val[*p-'A'];
        ++p;
        skipspace();
    }
    return r;

}

void skipspace()
{
    while(*p==' ')
        ++p;
}