Cod sursa(job #1946850)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 30 martie 2017 15:42:07
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <cstring>
using namespace std;

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

char s[1005], v[1005],x;
int i,n,m,N,w[120];

int exprOr();
int exprAnd();
int exprXor();
int factor();

int exprOr() {
    int r = exprAnd();
    while (v[i] == '|') {
        i++;
        r = (r | exprAnd());
    }
    return r;
}

int exprAnd() {
    int r = exprXor();
    while (v[i] == '&') {
        i++;
        r = (r & exprXor());
    }
    return r;
}

int exprXor() {
    int r = factor();
    while (v[i] == '^') {
        i++;
        r = (r^factor());
    }
    return r;
}

int factor() {
    int r;
    if (v[i] == '(') {
        i++;
        r = exprOr();
        i++;
    } else {
        if (v[i] == '1') {
            i++;
            return 1;
        }
        if (v[i] =='0') {
            i++;
            return 0;
        }
        return w[ v[i++] ];
    }
    return r;
}

int main () {
    fin.get(s, 1002);
    m = strlen (s);
    for (i=0;i<m;i++) {
        if (s[i] == ' ')
            continue;
        if (s[i] == 'O' && s[i+1] == 'R') {
            v[n++] = '|';
            i++;
            continue;
        }
        if (s[i]=='A' && s[i+1] == 'N') {
            v[n++] = '&';
            i+=2;
            continue;
        }
        if (s[i] == 'N' && s[i+1] == 'O') {
            v[n++] = '1';
            v[n++] = '^';
            i+=2;
            continue;
        }
        if (s[i] == 'T' && s[i+1] == 'R') {
            v[n++] = '1';
            i+=3;
            continue;
        }
        if (s[i]== 'F' && s[i+1] == 'A') {
            v[n++] = '0';
            i+=4;
            continue;
        }

        if (s[i] == '(' || s[i] == ')') {
            v[n++] = s[i];
            continue;
        }
        v[n++] = s[i];
    }
    fin>>N;
    for (;N--;) {
        fin>>x;
        w[x] = 1 - w[x];
        i = 0;
        fout<<exprOr();
    }


    return 0;
}