Cod sursa(job #2270845)

Utilizator Raresr14Rosca Rares Raresr14 Data 27 octombrie 2018 17:30:57
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 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,note();
int expresie(){
    int r;
    r=termen();
    while(v[i]=='|'){
        i++;
        if(termen()==1)
            r=1;
    }
    return r;
}
int termen(){
    int r;
    r=note();
    while(v[i]=='&'){
        i++;
        if(note()==0)
            r=0;
    }
    return r;
}
int note(){
    int r;
    r=factor();
    while(v[i]=='!'){
        i++;
        r=1-factor();
    }
    return r;
}
int factor(){
    int r;
    if(v[i]=='('){
        i++;
        r=expresie();
        i++;
    }else{
        if(v[i]=='1'){
            i++;
            return 1;
        }
        if(v[i]=='0'){
            i++;
            return 0;
        }
        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++]='1';
            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;
}