Cod sursa(job #2791580)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 30 octombrie 2021 19:49:15
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXX 1000

char v[MAXX];
char s[256];
int cnt;
FILE *fin,*fout;
int getString(){
  int i;
  char c, a;
  i = 0;
  c = fgetc(fin);
  a = 0;
  while(c != '\n' && a != '\n'){
    if(c != ' '){
      if(c == ')' || c == '('){
        v [i] = c;
        i ++;
      }else{
        a = fgetc(fin);
        if(a == ' ' || a == ')' || a == '(' || a == '\n'){
          v[i] = c;
          i ++;
          if(a == ')' || a == '('){
            v[i] = a;
            i ++;
          }
        }else{
            if (c == 'N'){
              v [i] = '!';
              i ++;
              fgetc (fin);
            }
            else if (c == 'A'){
              v [i] = '&';
              i++;
              fgetc (fin);
            }
            else if (c == 'O'){
              v [i] = '|';
              i ++;
            }
            else if (c == 'T'){
              v [i] = 1;
              i ++;
              fgetc (fin);
              fgetc (fin);
            }
            else if (c == 'F'){
              v [i] = 0;
              i ++;
              fgetc (fin);
              fgetc (fin);
              fgetc (fin);
            }
          }
      }
    }
    if(a != '\n'){
      c = fgetc (fin);
    }
  }
  return i;
}

int Or ();

int factor (){
  int fact;

  if(v [cnt] == '('){
    cnt ++;
    fact = Or ();
    cnt ++;
  }else{
    fact = 0;
    if(v [cnt] == 0 || v [cnt] == 1){
      fact = v [cnt];
    }else{
      fact = s [v [cnt]];
    }
    cnt ++;
  }
  return fact;
}

int Not (){
  int fact, x;

  x = 0;
  if(v [cnt] == '!'){
    x = 1;
  }
  while (v [cnt] == '!'){
    cnt ++;
    fact = 1 - factor ();
  }
  if (x == 0){
    fact = factor ();
  }
  return fact;
}

int And(){
  int fact;

  fact = Not();
  while (v [cnt] == '&'){
    cnt ++;
    fact *= Not ();
  }
  return fact;
}
int Or (){
  int fact, x;

  fact = And();
  while (v [cnt] == '|'){
    cnt ++;
    x = And();
    if (x + fact >= 1){
      fact = 1;
    }
  }
  return fact;
}

int main(){
  int n, m, i;
  char a;
  fin = fopen("bool.in","r");
  fout = fopen("bool.out","w");

  n = getString();
  fscanf(fin, "%d ", &m);

  for(i = 0; i < m; i ++){
    a = fgetc (fin);
    s [a] = 1 - s [a];
    cnt = 0;
    fprintf (fout, "%d", Or ());
  }
  return 0;
}