Cod sursa(job #2791285)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 30 octombrie 2021 12:31:56
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.62 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>

using namespace std;

//ifstream in("bool.in");
//ofstream out("bool.out");

const int MAXS = 1000;
const int MAXC = 26;

bool caract[MAXC];

char e[MAXS];
int size_e;

char s[MAXS];
int size_s;

//-//-//-//-//- Construire ecuatie -//-//-//-//-

void construct_e(){
  bool ok = 1;
  size_e = 0;
  size_s = 0;
  while( s[size_s] != '\n' ){
    ok = 1;
    //cout<<"size: "<<size_s<<" "<<s[size_s]<<" "<<s[size_s + 1]<<" "<<s[size_s + 2];

    //TRUE
    if(ok == 1 && s[size_s] == 'T' && s[size_s + 1] == 'R' && s[size_s + 2] == 'U' && s[size_s + 3] == 'E' ){
      e[size_e] = '1';
      size_e++;
      size_s += 3;
      ok = 0;
    }


    //FALSE
    if(ok == 1 && s[size_s] == 'F' && s[size_s + 1] == 'A' && s[size_s + 2] == 'L' && s[size_s + 3] == 'S' && s[size_s + 4] == 'E' ){
      e[size_e] = '0';
      size_e++;
      size_s += 4;
      ok = 0;
    }

    //AND
    if(ok == 1 &&  s[size_s] == 'A' && s[size_s + 1] == 'N' && s[size_s + 2] == 'D' ){
      e[size_e] = '&';
      size_e++;
      size_s += 2;
      ok = 0;
    }

    //OR
    if(ok == 1 &&  s[size_s] == 'O' && s[size_s + 1] == 'R' ){
      e[size_e] = '|';
      size_e++;
      size_s += 1;
      ok = 0;
    }

    //NOT
    if(ok == 1 && s[size_s] == 'N' && s[size_s + 1] == 'O' && s[size_s + 2] == 'T' ){
      e[size_e] = '!';
      size_e++;
      size_s += 2;
      ok = 0;
    }

    //CARACT
    if( ok == 1 && s[size_s] >= 'A' && s[size_s] <= 'Z' ){
      e[size_e] = s[size_s];
      caract[s[size_s] - 'A'] = 0;
      size_e++;
      ok = 0;
    }

    //PARANT
    if(ok == 1 && ( s[size_s] == '(' || s[size_s] == ')' ) ){
      e[size_e] = s[size_s];
      size_e++;
      ok = 0;
    }
    //cout<<" "<<e[size_e - 1]<<'\n';
    size_s++;
  }

}


//-//-//-//-//- Rezolvare ecuatie -//-//-//-//-


bool myOr();


bool fact(){
  bool number;

  //cout<<e[size_e]<<'\n';

  if( e[size_e] == '!' ){
    size_e++;
    if( e[size_e] == '(' ){
      size_e++;
      number = !myOr();
      size_e++;
    }

    else{
      if( e[size_e] >= 'A' && e[size_e] <= 'Z' ){
        number = !caract[e[size_e] - 'A'];
      }
      else
        number = !( e[size_e] - '0' );

      size_e++;
    }
  }

  else{
    if( e[size_e] == '(' ){
      size_e++;
      number = myOr();
      size_e++;
    }
    else{
      if( e[size_e] >= 'A' && e[size_e] <= 'Z' ){
        number = caract[e[size_e] - 'A'];
      }
      else
        number = e[size_e] - '0';

      size_e++;
    }
  }

  //cout<<"fact: "<<number<<'\n';
  return number;
}

bool myAnd(){
  bool rezultat;

  rezultat = fact();
  while( e[size_e] == '&' ){
    size_e++;
    rezultat = rezultat & fact();
  }

  //cout<<"and: "<<rezultat<<'\n';
  return rezultat;
}

bool myOr(){
  bool rezultat;

  rezultat = myAnd();
  while( e[size_e] == '|' ){
    size_e++;
    rezultat = rezultat | myAnd();
  }

  //cout<<"ori: "<<rezultat<<'\n';
  return rezultat;
}


//-//-//-//-//- Int main -//-//-//-//-

int main(){
  FILE *fin, *fout;

  fin = fopen("bool.in", "r");
  fout = fopen("bool.out", "w");

  fgets(s, MAXS, fin);

  //fputs(s, fout);
  construct_e();
  //fputs(e, fout);

  char c;
  int n, i;
  size_e = 0;
  fscanf(fin,"%d ", &n );
  for( i = 0; i < n; i++ ){
    c = fgetc(fin);
    //fputc(c, fout);
    caract[c - 'A'] = caract[c - 'A'] ^ 1;
    //fprintf(fout, "%d \n", caract[c - 'A']);
    fprintf(fout, "%d", myOr());
    size_e = 0;
  }

  //out<<s;
  return 0;
}