Cod sursa(job #2703631)

Utilizator YusyBossFares Yusuf YusyBoss Data 8 februarie 2021 20:51:44
Problema Bool Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <stdio.h>

using namespace std;

char v[1005];
bool var[100];
int poz_cur;

int minim(int a, int b) {
  return a < b ? a : b;
}

int maxim(int a, int b) {
  return a > b ? a : b;
}

char comparatie();
bool expresie();
bool termen();

char comparatie() {
  char val = '0';
  if ( v[poz_cur] == 'A' && v[poz_cur + 1] == 'N' ) {
    poz_cur += 3;
    val = '&';
  } else if ( v[poz_cur] == 'O' && v[poz_cur + 1] == 'R' ) {
    poz_cur += 2;
    val = '|';
  }
  return val;
}

bool termen() {
  bool val;
  char ch;

  ch = v[poz_cur++];
  if (ch == '(')
    val = expresie();
  else if( ch == 'T' && v[poz_cur] == 'R' ) {
    poz_cur += 3;
    val = 1;
  } else if( ch == 'F' && v[poz_cur] == 'A' ) {
    poz_cur += 4;
    val = 0;
  } else if( ch == 'N' && v[poz_cur] == 'O' ) {
    poz_cur += 2;
    val = !termen();
  } else {
    val = var[ch];
  }
  return val;
}

bool expresie() {
  char semn;
  bool val1, val2;

  val1 = termen();
  semn = -1;
  while ( semn != '0' ) {
    semn = comparatie();
    if( semn != '0' ) {

      if (semn == '&') {
        val2 = termen();
        val1 = ( val1 & val2 );
      }
      else
        val1 = (val1 | expresie());
    }
  }

  if (v[poz_cur] == ')')
    poz_cur++;

  return val1;
}

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

  fin = fopen("bool.in", "r");
  fout = fopen("bool.out", "w");
  int i, n;
  char ch;
  i = 0;
  ch = fgetc( fin );
  while ( ch != '\n' ) {
    if( ch != ' ' ) {
      v[i++] = ch;
    }
    ch = fgetc( fin );
  }
  fscanf( fin, "%d", &n );
  fgetc( fin );
  for( i = 0; i < n; i++ ) {
    ch = fgetc( fin );
    var[ch] = ( 1 - var[ch] );
    poz_cur = 0;
    fprintf(fout, "%d", expresie() );
  }
  fclose( fout );
  return 0;
}