Cod sursa(job #1865973)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 2 februarie 2017 13:57:27
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <cctype>
#include <cstring>
#define MAXN 1001
FILE *fin,*fout;
char ch,sir[MAXN+1];
int v[26];
int k,j;
bool e();
bool a();
bool n();
bool p();
bool e()
{
    bool ans=a();
    while(ch=='|')
    {
        ch=sir[j++];
        ans|=a();
    }
    return ans;
}
bool a()
{
    bool ans=n();
    while(ch=='&')
    {
        ch=sir[j++];
        ans&=n();
    }
    return ans;
}
bool n()
{
    bool ans=true;
    while(ch=='!')
    {
        ch=sir[j++];
        ans=!ans;
    }
    if(ans)
        ans=p();
    else
        ans=!p();
    return ans;
}
bool p()
{
    bool ans;
    if(ch=='(')
    {
        ch=sir[j++];
        ans=e();
        ch=sir[j++];
    }
    else
    {
        ans=ch;
        ch=sir[j++];
    }
    return ans;
}
void prelucrare()
{
    int i,lung=strlen(sir)-1;
    char cuv[6];
    ch=sir[j++];
    while(j<=lung)
    {
        i=0;
        while(isalpha(ch))
        {
            cuv[i++]=ch;
            ch=sir[j++];
        }
        cuv[i]='\0';
        if(i==1)
            sir[k++]=0,v[cuv[0]-'A']=k-1;
        else
            if(!strcmp(cuv,"TRUE"))
                sir[k++]=1;
        else
            if(!strcmp(cuv,"FALSE"))
                sir[k++]=0;
        else
            if(!strcmp(cuv,"AND"))
                sir[k++]='&';
        else
            if(!strcmp(cuv,"NOT"))
                sir[k++]='!';
        else
            if(!strcmp(cuv,"OR"))
                sir[k++]='|';
        if(ch!=' ')
            sir[k++]=ch;
        ch=sir[j++];
    }
}
int main()
{
    fin=fopen("bool.in","r");
    fout=fopen("bool.out","w");
    fgets(sir,MAXN,fin);
    int n,i;
    char lit;
    prelucrare();
    fscanf(fin,"%d\n",&n);
    for(i=0;i<n;i++)
    {
        lit=fgetc(fin);
        sir[v[lit-'A']]^=1;
        ch=sir[0];j=1;
        fprintf(fout,"%d",e());
    }
    return 0;
}