Pagini recente » Profil Samoila_Alexandru | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2491330)
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int NMAX = 105;
const int LMAX = 1005;
int p;
bool v[30];
char s[LMAX], sir[LMAX];
bool termen();
bool expresie();
bool factor();
bool expresie() {
bool x = termen();
while (sir[p] == '|') {
p++;
x = x | termen();
}
return x;
}
bool termen() {
bool y = factor();
while (sir[p] == '&') {
p++;
y = y & factor();
}
return y;
}
bool factor () {
int semn = 0;
bool val;
// printf ("p de la inc factor : %d\n\n", p);
while (sir[p] == '!') {
p++;
semn++;
}
semn %= 2;
if (semn == 1)
return !factor();
if (sir[p] == '(') {
p++;
val = expresie();
p++;
if (semn == 0)
return val;
return !val;
}
if (sir[p] == '1' || sir[p] == '0') {
if (sir[p] == '0')
val = false;
else
val = true;
}
else
val = v[sir[p] - 'A'];
p++;
if (semn == 0)
return val;
return !val;
}
int main() {
freopen ("bool.in", "r", stdin);
freopen ("bool.out", "w", stdout);
int n, i, q, k, cuv;
char ch;
cin.getline(s, LMAX);
n = strlen(s);
i = k = 0;
while (i < n) {
if (s[i] >= 'A' && s[i] <= 'Z') {
if (s[i] == 'T' || s[i] == 'F' || s[i] == 'A' || s[i] == 'O' || s[i] == 'N') {
i++;
if (i == n || s[i] == ' ' || s[i] ==')') {
sir[k++] = s[i - 1];
i--;
}
else {
i--;
if (s[i] == 'T') {
cuv = 4;
sir[k++] = '1';
}
if (s[i] == 'F') {
cuv = 5;
sir[k++] = '0';
}
if (s[i] == 'A') {
cuv = 3;
sir[k++] = '&';
}
if (s[i] == 'O') {
cuv = 2;
sir[k++] = '|';
}
if (s[i] == 'N') {
sir[k++] = '!';
cuv = 3;
}
i += cuv;
}
}
else
sir[k++] = s[i];
}
else if (s[i] != ' ')
sir[k++] = s[i];
i++;
}
sir[k] = '\0';
scanf ("%d ", &q);
for (i = 0; i < 26; i++)
v[i] = false;
for (i = 1; i <= q; i++) {
scanf ("%c", &ch);
v[ch - 'A'] = !v[ch - 'A'];
// printf ("%d%d\n", v[0], v[1]);
p = 0;
printf ("%d", expresie());
}
// printf ("\n%s", sir);
return 0;
}