Cod sursa(job #1939997)

Utilizator GoogalAbabei Daniel Googal Data 26 martie 2017 11:56:51
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

int n,k,z,pointer;
char x,line[1005],s[1005],curchar;
bool alp[30];

bool or_or(bool);
bool termen(bool);
bool negatie();

void readnextchar()
{
    curchar=s[pointer];
    pointer++;
}

void proces()
{
  for(int i=0;i<z;i++)
  {
    if(line[i]=='A' && line[i+1]=='N'){
      s[k++]='&';
      i+=2;
    }
    else if(line[i]=='O' && line[i+1]=='R'){
      s[k++]='|';
      i++;
    }
    else if(line[i]=='N' && line[i+1]=='O'){
      s[k++]='!';
      i+=2;
    }
    else if(line[i]=='F' && line[i+1]=='A'){
      s[k++]='0';
      i+=4;
    }
    else if(line[i]=='T' && line[i+1]=='R'){
      s[k++]='1';
      i+=3;
    }
    else if(line[i]!=' ')
      s[k++]=line[i];
  }
}

bool negatie()
{
  if(curchar=='!'){
    readnextchar();
    return !negatie();
  }
  else if(curchar == '1'){
    readnextchar();
    return true;
  }
  else if(curchar == '0'){
    readnextchar();
    return false;
  }
  else if(curchar == '('){
    readnextchar();
    bool b = or_or(0);
    readnextchar();
    return b;
  }
  else{
    bool b = alp[curchar-'A'];
    readnextchar();
    return b;
  }
}

bool termen(bool answer)
{
  bool r = negatie();
  if(curchar == '&'){
    readnextchar();
    return termen(answer & r);
  }
  return (answer & r);
}

bool or_or(bool answer)
{
  bool r = termen(1);
  if(curchar == '|'){
    readnextchar();
    return or_or(answer | r);
  }
  return (answer | r);
}

int main()
{
    fin.getline(line,1005);
    fin>>n;
    z=strlen(line);
    proces();
    for(int i=0; i<n; i++)
    {
      fin>>x;
      alp[x-'A']=!alp[x-'A'];
      pointer=0;
      readnextchar();
      fout<<or_or(0);
    }
    fin.close();
    fout.close();
    return 0;
}