Cod sursa(job #1849742)

Utilizator blackmanta45Andrei blackmanta45 Data 17 ianuarie 2017 19:55:27
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char S[1010],v[1010],w[101],c;
int n,m;
int preluc (int n){
    int k=0;
    for(int i=0;i<n;i++){
        if(S[i]=='A' && S[i+1]=='N' && S[i+2]=='D')
            v[++k]='&',i+=2;
        else
            if(S[i]=='F' && S[i+1]=='A')
                v[++k]=0,i+=4;
            else
                if(S[i]=='T' && S[i+1]=='R')
                    v[++k]=1,i+=3;
                else
                    if(S[i]=='(')
                       v[++k]='(';
                    else
                        if(S[i]==')')
                            v[++k]=')';
                        else
                            if(S[i]=='N' && S[i+1]=='O')
                                v[++k]='!',i+=2;
                            else
                                if(S[i]=='O' && S[i+1]=='R')
                                    v[++k]='|',i++;
                                else
                                    if(S[i]==' ')
                                        continue;
                                    else{
                                        v[++k]=S[i];
                                    }
    }
}
int expresie ();
int termen ();
int factor ();

int main (){
    fin.get(S,1010);
    n=strlen(S);
    preluc(n);
    fin>>m;
    for(int k=1;k<=m;k++){
        fin>>c;
        n=1;
        w[c-'A']=1-w[c-'A'];
        fout<<expresie();

    }
}

int expresie () {
    int val=termen();
    while(v[n]=='|'){
        n++;
        val|=termen();
    }
    return val;
}

int termen () {
    int val=factor();
    while(v[n]=='&'){
        n++;
        val&=factor();
    }
    return val;
}

int factor () {
    int val=0;
    if(v[n]=='!'){
        val=1-val;
        n+=2;
        return val;
    }
    if(v[n]==1){
        val=1;
        n++;
        return val;
    }
    if(v[n]==0){
        val=0;
        n++;
        return val;
    }
    if(v[n]=='('){
        n++;
        val=expresie();
        n++;
        return val;
    }
    n++;
    return w[v[n-1]-'A'];
}