Cod sursa(job #876713)

Utilizator deneoAdrian Craciun deneo Data 12 februarie 2013 00:40:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<fstream>
#include<string.h>
using namespace std;

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

int p;
char s[1010], mod;
bool val[300];
bool si();
bool dif();


bool sau(){
    bool aux = si();
    while(s[p] == '|'){
        p++;
        aux |= si();
    }
    return aux;
}

bool si(){
    bool aux = dif();
    while(s[p] == '&'){
        p++;
        aux &= dif();
    }
    return aux;
}

bool dif(){
    bool aux;

    if (s[p] == '1') {
        ++p;
        return 1;
    }
    if (s[p] == '0') {
        ++p;
        return 0;
    }

    while(s[p] == '!'){
        p++;
        return !dif();
    }

    if(s[p] == '('){
        p++;
        aux = sau();
        p++;
        return aux;
    }

    aux = val[s[p]];
    ++p;
    return aux;
}


int main(){

    int i, j, m, n;

    fin.getline(s, 1010);

    n = strlen(s)-1;
    for(i=0,j=0; i<=n; ++i){
        if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D'){
            s[j] = '&';
            i+= 2;
            j++;
        }
        else if(s[i]=='O' && s[i+1]=='R'){
            s[j] = '|';
            i+= 1;
            j++;
        }
        else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T'){
            s[j] = '!';
            i+= 2;
            j++;
        }
        else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E'){
            s[j] = '1';
            i+= 3;
            j++;
        }
        else if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E'){
            s[j] = '0';
            j++;
            i+= 4;
        }
        else if(s[i] == ' ');
        else{
            s[j] = s[i];
            j++;
        }
    }

/*
    s[j] = '\0';
    fout << s;
*/

    s[j] = '\0';
    s[j + 1] = '\0';
    fin >> m;
    for(i=0; i<m; ++i){
        fin >> mod;
        val[mod] = !val[mod]; p = 0;
        fout << sau();
    }

    fin.close();
    fout.close();

    return 0;
}