Pagini recente » Monitorul de evaluare | Cod sursa (job #384737) | Cod sursa (job #1462973) | Cod sursa (job #1726478) | Cod sursa (job #273587)
Cod sursa(job #273587)
#include<stdio.h>
bool a[100];
int n, i;
char p, e[2000], buf[2000];
bool EvalExpr(), EvalFactor(), EvalTermen();
int main(){
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
fgets(buf, 2000, stdin);
for (i = 0, n = 0; buf[i] != '\n'; ++i)
if ( buf[i] != ' ' )
e[n++] = buf[i];
for (i = 0; i < 'Z' - 'A' + 1; ++i)
a[i] = 0;
scanf("%d\n",&n);
for (; n; n--){
scanf("%c", &p);
a[p-'A'] = 1-a[p-'A'];
i = 0;
printf("%d",(EvalExpr()) ? 1 : 0);
}
printf("\n");
return 0;
}
bool EvalExpr(){
bool r = EvalTermen();
while (e[i]=='O'&& e[i+1] == 'R'){
i += 2;
r |= EvalTermen();
}
return r;
}
bool EvalTermen(){
bool r = EvalFactor();
while (e[i] == 'A' && a[i+1] == 'N'){
i += 3;
r &= EvalFactor();
}
return r;
}
bool EvalFactor(){
bool f;
if (e[i] == 'N' && e[i+1] == 'O'){
i += 3;
f = ! EvalFactor();
}
else
if (e[i] == '(' ){
i++;
f = EvalExpr();
i++;
}
else
if (e[i] == 'T' && e[i+1] == 'R'){
i += 4;
return 1;
}
else
if (e[i] == 'F' && e[i+1] == 'A'){
i += 5;
return 0;
}
else
{
f = a[e[i]-'A'];
i++;
}
return f;
}