Pagini recente » Cod sursa (job #2857568) | Cod sursa (job #1885945) | Cod sursa (job #533849) | Cod sursa (job #71680) | Cod sursa (job #2520143)
#include <fstream>
#include <string>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
string str;
char chr;
bool init;
bool var[30];
int nrnr;
void atrb(bool* val1, bool* val2, bool* initval, bool* both, bool* neg) {
if (*neg == true) {
init = !init;
}
if (*initval == false) {
*val1 = init;
*initval = true;
}
else {
*val2 = init;
if (*both == true) {
*val1 = *val1 && *val2;
}
else {
*val1 = *val1 || *val2;
}
}
*neg = false;
}
bool decide(string str) {
int cnt = 0;
int brak = 0;
bool val1;
bool val2;
bool initval = false;
bool both;
bool neg = false;
string sti;
while ((unsigned int) cnt < str.size()) {
sti = str[cnt];
cnt++;
init = false;
if (sti == "(") {
sti = "";
brak = 1;
if (str[cnt] == '(') {
brak++;
}
if (str[cnt] == ')') {
brak--;
}
while (brak > 0) {
sti += str[cnt];
cnt++;
if (str[cnt] == '(') {
brak++;
}
if (str[cnt] == ')') {
brak--;
}
}
init = decide(sti);
atrb(&val1, &val2, &initval, &both, &neg);
}
while (str[cnt] != ' ' && (unsigned)cnt < str.size()) {
sti += str[cnt];
cnt++;
}
if (sti.size() == 1) {
chr = sti[0];
init = var[chr - 'A'];
atrb(&val1, &val2, &initval, &both, &neg);
}
if (sti == "TRUE") {
init = true;
atrb(&val1, &val2, &initval, &both, &neg);
}
if (sti == "FALSE") {
init = false;
atrb(&val1, &val2, &initval, &both, &neg);
}
if (sti == "NOT") {
neg = !neg;
}
if (sti == "AND") {
both = true;
}
if (sti == "OR") {
both = false;
}
cnt++;
}
return val1;
}
int main()
{
fin.get(chr);
while (chr != '\n') {
str += chr;
fin.get(chr);
}
fin >> nrnr;
for (int index = 0; index < nrnr; index++) {
fin >> chr;
var[chr - 'A'] = !var[chr - 'A'];
if (decide(str)) {
fout << "1";
}
else {
fout << "0";
}
}
return 0;
}