Cod sursa(job #1995601)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 28 iunie 2017 16:34:59
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

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

char expr[1010];
char aux[1010];
char valOpus[200];
int lg;
int item;

void convertire(){
  int lgAux = strlen(aux);
  for(int i = 0; i < lgAux; i++){
    if(aux[i] == ' '){
      continue;
    }
    if(aux[i] == '(' || aux[i] == ')'){

      expr[lg++] = aux[i];
    }
    else if(aux[i] == 'T' && aux[i + 1] == 'R'){
      i += 3;
      expr[lg++] = '1';
    }
    else if(aux[i] == 'F' && aux[i + 1] == 'A'){
      i += 4;
      expr[lg++] = '0';
    }
    else if(aux[i] == 'N' && aux[i + 1] == 'O'){
      i += 2;
      expr[lg++] = '1';// ca sa il faci binar A^A = F , A ^ F = A
      expr[lg++] = '!';
    }
    else if(aux[i] == 'A' && aux[i + 1] == 'N'){
      i += 2;
      expr[lg++] = '&';
    }
    else if(aux[i] == 'O' && aux[i + 1] == 'R'){
      i ++;
      expr[lg++] = '|';
    }
    else
      expr[lg++] = aux[i];
  }
}

int factor();
int NOT();
int SAU();
int SI();


void citire(){
  in.getline(aux,1001);
  convertire();
}

int SAU(){
  int calcul = SI();
  while(expr[item] == '|'){
    item++;
    calcul = calcul | SI();
  }
  return calcul;
}

int SI(){
  int calcul = NOT();
  while(expr[item] == '&'){
    item++;
    calcul = calcul & NOT();
  }
  return calcul;
}

int NOT(){
  int calcul = factor();
  while(expr[item] == '!'){
    item++;
    calcul = calcul ^ factor();
  }
  return calcul;
}

int factor(){
  int calcul = 0 ;
  if(expr[item] == '('){
    item++;
    calcul = SAU();
    item++;
  }
  else{
    if(expr[item] == '1'){
      item++;
      return 1;
    }
    if(expr[item] == '0'){
      item++;
      return 0;
    }
  //caz in care e litera si trebuie  inlocuita cu opusul
    return valOpus[expr[item++]];
  }
  return calcul;
}

int main(){
  citire();
  int n;
  char temp;
  in >> n;
  for(int i = 1; i <= n; i++){
    in >> temp;
    valOpus[temp] = 1 - valOpus[temp];
    item = 0;
    out << SAU();
  }
  return 0;
}