Cod sursa(job #1948058)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 31 martie 2017 17:21:06
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>

using namespace std;
int fact ();
int si ();
int sau();
int sauex();
int ec;
char s[1005],a[1005];
int f[30];
int sau (){
    int r=si ();
    while (a[ec]=='|'){
        ec++;
        r=(r | si ());
    }
    return r;
}
int si (){
    int r=sauex ();
    while (a[ec]=='&'){
        ec++;
        r= (r & sauex());
    }
    return r;
}
int sauex (){
    int r=fact ();
    while (a[ec]=='^'){
        ec++;
        r= (r ^ fact ());
    }
    return r;
}
int fact (){
    int r=0;
    if (a[ec]=='('){
        ec++;
        r=sau ();
        ec++;
    }
    else if (a[ec]=='0' || a[ec]=='1'){
        r=a[ec]-'0';
        ec++;
    }
    else if ('A'<=a[ec] && a[ec]<='Z'){
        r=f[a[ec]-'A'+1];
        ec++;
    }
    return r;
}
int main()
{
    FILE *fin=fopen ("bool.in","r");
    FILE *fout=fopen ("bool.out","w");
    int c=0,n,i;
    char ch;
    fgets (s,1005,fin);
    for (i=0;s[i]!='\n';i++){
        if (s[i]==' ')
            continue;
        if (s[i]=='A' && s[i+1]=='N'){
            a[++c]='&';
            i+=2;
        }
        else if (s[i]=='O' && s[i+1]=='R'){
            a[++c]='|';
            i++;
        }
        else if (s[i]=='N' && s[i+1]=='O'){
            a[++c]='1';
            a[++c]='^';
            i+=2;
        }
        else if (s[i]=='(' || s[i]==')')
            a[++c]=s[i];
        else if (s[i]=='T' && s[i+1]=='R'){
            a[++c]='1';
            i+=3;
        }
        else if (s[i]=='F' && s[i+1]=='A'){
            a[++c]=0;
            i+=4;
        }
        else if ('A'<=s[i] && s[i]<='Z')
            a[++c]=s[i];
    }
    fscanf (fin,"%d\n",&n);
    for (i=1;i<=n;i++){
        ch=fgetc (fin);
        f[ch-'A'+1]=1-f[ch-'A'+1];
        ec=1;
        fprintf (fout,"%d",sau());
    }
    return 0;
}