Cod sursa(job #2270825)

Utilizator Raresr14Rosca Rares Raresr14 Data 27 octombrie 2018 17:00:02
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1100],c,v[1010];
int n,f[1100],k,expresie(),termen(),factor(),i;
int expresie(){
    int r;
    r=termen();
    while(v[i]=='|'){
        i++;
        if(termen()==1)
            r=1;
    }
    return r;
}
int termen(){
    int r;
    r=factor();
    while(v[i]=='&'){
        i++;
        if(factor()==0)
            r=0;
    }
    return r;
}
int factor(){
    int r;
    if(v[i]=='!'){
        i++;
        r=1-f[v[i]-'0'];
        i++;
    }else{
        if(v[i]=='('){
           i++;
           r=expresie();
           i++;
        }else{
            r=f[v[i]-'0'];
            i++;
        }
    }
    return r;
}
int main () {
    fin.get(s,1100);
    fin>>n;
    f['1'-'0']=1;
    for(int t=0;s[t]!=0;t++){
        if(s[t]==' ')
            continue;
        if(s[t]=='A'&&s[t+1]=='N'){
            v[k++]='&';
            t+=2;
            continue;
        }
        if(s[t]=='N'&&s[t+1]=='O'){
            v[k++]='!';
            t+=2;
            continue;
        }
        if(s[t]=='O'&&s[t+1]=='R'){
            v[k++]='|';
            t++;
            continue;
        }
        if(s[t]=='('||s[t]==')'){
            v[k++]=s[t];
            continue;
        }
        if(s[t]=='T'&&s[t+1]=='R'){
            v[k++]='1';
            t+=3;
            continue;
        }
        if(s[t]=='F'&&s[t+1]=='A'){
            v[k++]='0';
            t+=4;
            continue;
        }
        v[k++]=s[t];
    }
    for(int j=1;j<=n;j++){
        fin>>c;
        i=0;
        f[c-'0']=1-f[c-'0'];
        fout<<expresie();
    }
    return 0;
}