Cod sursa(job #2363701)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 3 martie 2019 15:24:45
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>

#define MAXCH 30

using namespace std;

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

string s;
int p;

bool val[MAXCH];
bool expresie();

bool numar( )
{
  if( s[p]=='1' )
  {
    p++;

    return true;
  }
  else if( s[p]=='0' )
  {
    p++;

    return false;
  }
  else
  {
    p++;

    return val[s[p-1]-'A'];
  }
}

bool factor( )
{
  bool ans;

  if( s[p]=='(' )
  {
    p++;
      ans=expresie();
    p++;
  }
  else if( s[p]=='!' )
  {
    p++;

    ans=!numar();
  }
  else
    ans=numar();

  return ans;
}

bool termen( )
{
  bool ans=factor();

  while( s[p]=='&' )
  {
    p++;

    ans&=factor();
  }

  return ans;
}

bool expresie( )
{
  bool ans=termen();

  while( s[p]=='|' )
  {
    p++;

    ans|=termen();
  }

  return ans;
}

void convert( )
{
  for( int i=0;i<=s.size();i++ )
    if( s[i]==' ' )
    {
      s.erase(i,1);
      i--;
    }
    else if( s[i]=='N' && s[i+1]=='O' && s[i+2]=='T' )
    {
      s[i]='!';
      s.erase(i+1,2);
    }
    else if( s[i]=='O' && s[i+1]=='R' )
    {
      s[i]='|';
      s.erase(i+1,1);
    }
    else if( s[i]=='A' && s[i+1]=='N' && s[i+2]=='D' )
    {
      s[i]='&';
      s.erase(i+1,2);
    }
    else if( s[i]=='T' && s[i+1]=='R' )
    {
      s[i]='1';
      s.erase(i+1,3);
    }
    else if( s[i]=='F' && s[i+1]=='A' )
    {
      s[i]='0';
      s.erase(i+1,4);
    }
}

int main()
{
  getline(cin,s);

  convert();

  int q;

  cin>>q;

  while( q-- )
  {
    char ch;

    cin>>ch;

    val[ch-'A']=!val[ch-'A'];

    p=0;

    cout<<expresie();
  }

  return 0;
}