Cod sursa(job #2270826)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 27 octombrie 2018 17:01:34
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <cstring>
#define DIM 1005

using namespace std;

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

char s[DIM], c[DIM], car;
int i, n, m, val[DIM/10];

int expresie1(), expresie2(), expresie3(), factor();

int main(){
    fin.get(s, DIM);
    for (i=0; i<strlen(s); i++){
        if (s[i] == ' '){
            continue;
        }
        if (s[i] == '(' || s[i] == ')'){
            c[n++] = s[i];
            continue;
        }
        if (s[i] == 'N' && s[i+1] == 'O' && s[i+2] == 'T'){ //este NOT
            c[n++] = '1';
            c[n++] = '^';
            i+=2;
            continue;
        }
        if (s[i] == 'A' && s[i+1] == 'N' && s[i+2] == 'D'){ //este AND
            c[n++] = '&';
            i+=2;
            continue;
        }
        if (s[i] == 'O' && s[i+1] == 'R'){ //este OR
            c[n++] = '|';
            i++;
            continue;
        }
        if (s[i] == 'T' && s[i+1] == 'R'){ //este TRUE
            c[n++] = '1';
            i+=3;
            continue;
        }
        if (s[i] == 'F' && s[i+1] == 'A'){ //este FALSE
            c[n++] = '0';
            i+=4;
            continue;
        }
        c[n++] = s[i]; //pun variabila

    }
    fin >> m;
    for (int cnt=1; cnt<=m; cnt++){
        fin >> car;
        i = 0;
        val[car] = 1 - val[car];
        fout << expresie1();
    }
    return 0;
}

int expresie1 (){ //OR
    int r;
    r = expresie2();
    while (c[i] == '|'){
        i++;
        r = (r | expresie2());
    }
    return r;
}

int expresie2 (){ //AND
    int r;
    r = expresie3();
    while (c[i] == '&'){
        i++;
        r = (r & expresie3());
    }
    return r;
}

int expresie3 (){ //NOT
    int r;
    r = factor();
    while (c[i] == '^'){
        i++;
        r = (r ^ factor());
    }
    return r;
}

int factor (){
    int r;
    if (c[i] == '('){
        i++;
        r = expresie1();
        i++;
    }
    else{
        if (c[i] == '0'){
            i++;
            return 0;
        }
        else if (c[i] == '1'){
            i++;
            return 1;
        }
        return val[c[i++]];
    }
    return r;
}