Pagini recente » Cod sursa (job #2212876) | Cod sursa (job #123045) | Cod sursa (job #597686) | Cod sursa (job #1349069) | Cod sursa (job #532488)
Cod sursa(job #532488)
#include <stdio.h>
#include <string.h>
#define LMax 1010
const char IN[]="bool.in",OUT[]="bool.out";
int N;
char S[LMax] , *p=S;
bool vals[26];
bool eval(),eval_and(),eval_not(),make();
bool eval()
{
bool b=eval_and();
while (*p=='|')
++p,
b= b | eval_and();
return b;
}
bool eval_and()
{
bool b=eval_not();
while ( *p=='&' )
++p,
b= b & eval_not();
return b;
}
bool eval_not()
{
int c=0;
while (*p=='!')
++c,++p;
switch(c%2)
{
case 1:
return !make();
case 0:
return make();
}
}
bool make()
{
bool b;
if (*p=='(')
{
++p;
b= eval();
++p;
}
else if (*p=='1' || *p=='0')
b= *p=='1';
else
b=vals[*p-'A'],
++p;
return b;
}
void trans(char *s)
{
int i,j;
for (i=j=0;s[i];++i)
{
if (s[i]=='(')
s[j++]='(';
else if (s[i]==')')
s[j++]=')';
else if (strncmp(s+i,"TRUE",4)==0)
s[j++]='1',i+=3;
else if (strncmp(s+i,"FALSE",5)==0)
s[j++]='0',i+=4;
else if (strncmp(s+i,"NOT",3)==0)
s[j++]='!',i+=2;
else if (strncmp(s+i,"AND",3)==0)
s[j++]='&',i+=2;
else if (strncmp(s+i,"OR",2)==0)
s[j++]='|',i+=1;
else if (s[i]>='A' && s[i]<='Z')
s[j++]=s[i];
}
s[j]=0;
}
int main()
{
int i;
char c;
freopen(IN,"r",stdin);
fgets( S , LMax , stdin );
S[strlen(S)-1]=0;
for (i=0;i<26;++i) vals[i]=false;
trans(S);
scanf("%d\n",&N);
freopen(OUT,"w",stdout);
for (i=0;i<N;++i)
{
scanf("%c",&c);
vals[c-'A']=!vals[c-'A'];p=S;
printf("%d",eval());
}
printf("\n");
fclose(stdout);
fclose(stdin);
return 0;
}