Cod sursa(job #1835608)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 27 decembrie 2016 10:57:42
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("bool.in");
ofstream out ("bool.out");
char line[1002];
int vp ,v[1002] ,vcalcul[100] ,pointer = 0;
char currentChar;
void chartoinfix(){
  int i = 0;
  while(line[i] != 0){
    if(line[i]=='T' && line[i+1]=='R' && line[i+2]=='U' && line[i+3]=='E'){
        v[vp] = 1;
        vp++;
        i+=4;
    } else if(line[i]=='F' && line[i+1]=='A' && line[i+2]=='L' && line[i+3]=='S' && line[i+4]=='E'){
        v[vp] = 0;
        vp++;
        i+=5;
    } else if(line[i] == 'N' && line[i+1] == 'O' && line[i+2] == 'T'){
        v[vp] = 4;
        vp++;
        i+=3;
    } else if(line[i] == 'A' && line[i+1] == 'N' && line[i+2] == 'D'){
        v[vp] = 3;
        vp++;
        i+=3;
    } else if(line[i] == 'O' && line[i+1] == 'R'){
        v[vp] = 2;
        vp++;
        i+=2;
    } else if(line[i]>='A' && line[i]<='Z'){
        v[vp] = int(line[i]);
        vp++;
        i++;
    } else if (line[i]=='('){
        v[vp] = -1;
        vp++;
        i++;
    } else if (line[i]==')'){
        v[vp] = -2;
        vp++;
        i++;
    } else
        i++;
  }
}

void readNextChar() {
  currentChar = v[pointer];
  pointer++;
}

bool integer(int result = 0) {
  if(1 == currentChar || currentChar == 0){
    int digit = currentChar;
    readNextChar();
    return integer(result * 10 + digit);
  } else if('A' <= currentChar && currentChar <= 'Z'){
    result = vcalcul[currentChar - 'A'];
  }
  return result;
}
int nu();
int sau(int result = 0, char op = 2);
//Factor = (Suma) sau Integer
int factor(){
  int result = 0;
  if(currentChar == -1) {
    readNextChar();
    result =  sau();
    readNextChar();
  } else if(currentChar == 4){
    return nu();
  }else{
    result =  integer();
  }
  return result;
}


int si(int result = 1, char op = 3);

int sau(int result, char op ) {
  if(op == 2){
   result = result || si();
  } if(currentChar == 2){
    op = currentChar;
    readNextChar();
    result = sau(result, op);
  }
  return result;
}

//Prod = Factor * Factor * Factor * .. * Factor
int si(int result, char op) { //1OP{prod}
  if(op == 3)
   result = result && factor();
  if(currentChar == 3){
    op = currentChar;
    readNextChar();
    result = si(result, op);
  }
  return result;
}

int nu(){
  if(currentChar == 4){
    readNextChar();
    return !nu();
  } else
     return sau();
}

int main()
{
  int n ,i ,j ,k;
  char c;
  in.getline(line ,2000, '\n');
  chartoinfix();
  in>>n;
  for(i = 0 ;i  < n ;i++){
    in>>c;
    vcalcul[c - 'A'] = !vcalcul[c - 'A'];
    pointer = 0;
    readNextChar();
    out<<sau();
  }
  return 0;
}