Pagini recente » Cod sursa (job #3216053) | Cod sursa (job #2464611) | Cod sursa (job #1902167) | Cod sursa (job #2687125) | Cod sursa (job #3174603)
#include <stdio.h>
#include <string.h>
#define FALSE 26
#define TRUE 27
#define MAX_L 28
bool values[MAX_L];
#define MAX_S 1000
char s[MAX_S];
int sLength;
int sIndex;
void simplify(char s[], int& sLength) {
int i, j;
i = 1, j = 1;
while (j < sLength) {
if (s[j - 1] == 'N' && s[j] == 'D') {
s[i - 2] = '&';
i = i - 1;
} else if (s[j - 1] == 'O' && s[j] == 'R')
s[i - 1] = '|';
else if (s[j - 1] == 'O' && s[j] == 'T') {
s[i - 2] = '!';
i = i - 1;
} else if (s[j - 1] == 'S' && s[j] == 'E') {
s[i - 4] = 'A' + FALSE;
i = i - 3;
} else if (s[j - 1] == 'U' && s[j] == 'E') {
s[i - 3] = 'A' + TRUE;
i = i - 2;
} else if (s[j] != ' ')
s[i++] = s[j];
++j;
}
s[sLength = i] = 0;
}
bool evaluate_or();
bool factor() {
bool factor;
bool shouldNegate;
shouldNegate = false;
while (s[sIndex] == '!') {
shouldNegate = !shouldNegate;
sIndex++;
}
factor = 0;
if (s[sIndex] == '(') {
++sIndex;
factor = evaluate_or();
++sIndex;
} else
factor = values[s[sIndex++] - 'A'];
return shouldNegate ? !factor : factor;
}
bool evaluare_and() {
bool result;
result = factor();
while (s[sIndex] == '&') {
++sIndex;
result &= factor();
}
return result;
}
bool evaluate_or() {
bool result;
result = evaluare_and();
while (s[sIndex] == '|') {
++sIndex;
result |= evaluare_and();
}
return result;
}
bool evaluate() {
sIndex = 0;
return evaluate_or();
}
int main() {
FILE *fin, *fout;
fin = fopen("bool.in", "r");
fout = fopen("bool.out", "w");
int q;
char ch;
fgets(s, MAX_S + 1, fin);
sLength = strlen(s);
simplify(s, sLength);
values[TRUE] = true;
values[FALSE] = false;
fscanf(fin, "%d\n", &q);
while (q--) {
ch = fgetc(fin);
values[ch - 'A'] = !values[ch - 'A'];
fprintf(fout, "%d", evaluate());
}
fputc('\n', fout);
fclose(fin);
fclose(fout);
return 0;
}