Pagini recente » Cod sursa (job #484177) | Cod sursa (job #540684) | Cod sursa (job #1655011) | Cod sursa (job #2718522) | Cod sursa (job #2789747)
#include <stdio.h>
#include <string.h>
#define MAXCH 1000
#define NR_LETTERS 26
char s[MAXCH];
char val_ch[NR_LETTERS];
int loc;
int AND();
int factor();
int OR() {
int result;
result = AND();
while ( s[loc] == '|' ) {
loc++;
result = result | AND();
}
return result;
}
int AND() {
int result;
result = factor();
while ( s[loc] == '&' ) {
loc++;
result = result & factor();
}
return result;
}
int factor() {
int result;
if ( s[loc] != '(' ) {
result = 0;
while ( s[loc] == '!' ){
result = (result + 1) % 2;
loc++;
}
if ( s[loc] == 1 || s[loc] == 0 ) {
result = (result + s[loc]) % 2;
} else {
if ( s[loc] == '(' ) {
result = (result + factor()) % 2;
loc--;
} else {
result = (result + val_ch[s[loc] - 'A']) % 2;
}
}
} else {
loc++;
result = OR();
}
loc++;
return result;
}
void read(char v[], FILE *fin) {
int i;
i = 0;
v[i] = fgetc(fin);
while ( v[i] != '\n' ) {
i++;
v[i] = fgetc(fin);
if ( v[i] == ' ' )
i--;
if ( i > 0 && (v[i - 1] == 'O' && v[i] == 'R' )) { // daca avem un operator OR il inlocuim cu |
i--;
v[i] = '|';
}
if ( i > 1 && (v[i - 2] == 'A' && v[i - 1] == 'N' && v[i] == 'D')) { // daca avem un operator AND il inlocuim cu &
i -= 2;
v[i] = '&';
}
if ( i > 1 && (v[i - 2] == 'N' && v[i - 1] == 'O' && v[i] == 'T')){ // daca avem un operator NOT il inlocuim cu !
i -= 2;
v[i] = '!';
}
if ( i > 2 && (v[i - 3] == 'T' && v[i - 2] == 'R' && v[i - 1] == 'U' && v[i] == 'E')) { // daca avem un operator TRUE il inlocuim cu 1
i -= 3;
v[i] = 1;
}
if ( i > 3 && (v[i - 4] == 'F' && v[i - 3] == 'A' && v[i - 2] == 'L' && v[i - 1] == 'S' && v[i] == 'E')) { // daca avem un operator FALSE il inlocuim cu 0
i -= 4;
v[i] = 0;
}
}
}
int main() {
FILE *fin, *fout;
fin = fopen("bool.in", "r");
fout = fopen("bool.out", "w");
int n;
char ch;
read(s, fin);
fscanf(fin, "%d", &n);
fgetc(fin);
while ( n-- ) {
ch = fgetc(fin);
val_ch[ch - 'A'] = (val_ch[ch - 'A'] + 1) % 2;
loc = 0;
fprintf(fout, "%d", OR());
}
fclose(fin);
fclose(fout);
return 0;
}