Cod sursa(job #1496300)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 4 octombrie 2015 18:35:55
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <stdio.h>
char fr[30],v[1000];
int k;
void verif(){
    if(k>=1)
        if(v[k]=='R'&&v[k-1]=='O'){
            k-=1;
            v[k]='|';
        }
    if(k>=2){
        if(v[k]=='D'&&v[k-1]=='N'&&v[k-2]=='A'){
            k-=2;
            v[k]='&';
        }
        if(v[k]=='T'&&v[k-1]=='O'&&v[k-2]=='N'){
            k-=2;
            v[k]='!';
        }
    }
    if(k>=3)
        if(v[k]=='E'&&v[k-1]=='U'&&v[k-2]=='R'&&v[k-3]=='T'){
            k-=3;
            v[k]=1;
        }
    if(k>=4)
        if(v[k]=='E'&&v[k-1]=='S'&&v[k-2]=='L'&&v[k-3]=='A'&&v[k-4]=='F'){
            k-=4;
            v[k]=0;
        }
}
int expr(int &i);
int term(int &i){
    int rez;
    if(v[i]==1||v[i]==0){
        rez=v[i];
        i++;
    }
    else
        if(v[i]=='!'){
            i++;
            if(v[i]=='('){
                i++;
                rez=1-expr(i);
            }
            else{
                rez=1-fr[v[i]-'A'];
                i++;
            }
        }
        else{
            rez=fr[v[i]-'A'];
            i++;
        }
    return rez;
}
int expr(int &i){
    char semn='&';
    int rez=1;
    while(i<=k&&v[i]!=')'){
         if(v[i]=='&'||v[i]=='|'){
            semn=v[i];
            i++;
         }
         else
            if(v[i]!='('&&v[i]!=')'){
                if(semn=='&')
                    rez=rez&term(i);
                else
                    rez=rez|term(i);
            }
            else
                if(v[i]=='('){
                    i++;
                    if(semn=='&')
                        rez=rez&expr(i);
                    else
                        rez=rez|expr(i);
                }
    }
    i++;
    return rez;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("bool.in","r");
    fout=fopen("bool.out","w");
    int i=0,n,rez,j;
    char ch;
    ch=fgetc(fin);
    v[0]=ch;
    while(ch!='\n'){
        ch=fgetc(fin);
        if(ch=='('||ch==')'){
            k++;
            v[k]=ch;
        }
        else
            if(ch>='A'&&ch<='Z'){
                k++;
                v[k]=ch;
                verif();
            }
    }
    fscanf(fin,"%d\n",&n);
    for(i=1;i<=n;i++){
        ch=fgetc(fin);
        fr[ch-'A']=(fr[ch-'A']+1)%2;
        j=0;
        rez=expr(j);
        fprintf(fout,"%d",rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}