Pagini recente » Cod sursa (job #123833) | Cod sursa (job #2777264) | Cod sursa (job #982875) | Cod sursa (job #984910) | Cod sursa (job #177207)
Cod sursa(job #177207)
#include <stdio.h>
#include <string.h>
int lg, N, i;
int V[30];
char e[2001];
char chg[2001];
FILE *fin = fopen("bool.in", "rt"), *fout = fopen("bool.out", "wt");
int evalExp();
int evalAnd();
int evalOr();
int eval();
void cSpaces();
int main()
{
int j;
fgets(e, 2001, fin);
lg = strlen(e) - 1;
fscanf(fin, "%d\n", &N);
fgets(chg, 1001, fin);
//fprintf(fout, "%s\n%s", e, chg);
for (j = 0; j < N; j++)
{
i = 0;
V[chg[j] - 'A'] = !V[chg[j] - 'A'];
fprintf(fout, "%d", evalExp());
}
fclose(fin), fclose(fout);
return 0;
}
int evalExp()
{
int f = evalOr();
cSpaces();
while (i < lg - 1 && e[i] == 'O' && e[i+1] == 'R')
{
i += 2;
cSpaces();
f |= evalOr();
}
return f;
}
int evalOr()
{
int f = evalAnd();
cSpaces();
while (i < lg - 2 && e[i] == 'A' && e[i+1] == 'N' && e[i+2] == 'D')
{
i += 3;
cSpaces();
f &= evalAnd();
}
return f;
}
int evalAnd()
{
int f, neg = 0;
if (i < lg - 2 && e[i] == 'N' && e[i+1] == 'O' && e[i+2] == 'T')
{
i += 3;
cSpaces();
neg = 1;
f = evalAnd();
}
else if (e[i] == '(')
{
i++;
cSpaces();
// fprintf(fout, "%d %d\n", i, lg);
f = evalExp();
i++;
// fprintf(fout, "%d %d\n", i, lg);
cSpaces();
}
else
f = eval();
return (neg) ? (1 - f) : f;
}
int eval()
{
char c = e[i];
if (i < lg - 3 && e[i] == 'T' && e[i+1] == 'R' && e[i+2] == 'U' && e[i+3] == 'E')
{
i += 4;
cSpaces();
return 1;
}
if (i < lg - 4 && e[i] == 'F' && e[i+1] == 'A' && e[i+2] == 'L' && e[i+3] == 'S' && e[i+4] == 'E')
{
i += 5;
cSpaces();
return 0;
}
i++;
cSpaces();
// fprintf(fout, "%c %d\n", c, V[c - 'A']);
return V[c - 'A'];
}
void cSpaces()
{
while (i < lg && e[i] == ' ') i++;
}