Pagini recente » Cod sursa (job #690404) | Cod sursa (job #1944571) | Cod sursa (job #2531400) | Cod sursa (job #213803) | Cod sursa (job #138378)
Cod sursa(job #138378)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
char exp[1002];
bool vars[26];
int pos;
void skipWhite() {
while (exp[pos] == ' ') {
++pos;
}
}
bool getVar() {
// cout << " " << exp[pos] << "(" << pos << ") ";
bool a = vars[exp[pos] - 'A'];
++pos;
skipWhite();
return a;
}
bool boolExpression();
bool factor() {
// cout << "{F(" << pos << ") ";
bool a;
if (exp[pos] == '(') {
++pos;
skipWhite();
a = boolExpression();
++pos;
skipWhite();
} else
a = getVar();
// cout << "F(" << pos << ")}";
return a;
}
typedef bool (*ParseFunction)();
bool notFactor() {
ParseFunction f;
bool neg = false;
// cout << "{NF(" << pos << ") ";
if (strstr(exp + pos, "NOT") == exp + pos) {
pos += 3;
skipWhite();
neg = true;
f = notFactor;
//return !notFactor();
} else {
f = factor;
//return factor();
}
bool a = f();
// cout << "NF(" << pos << ")}";
if (neg)
return !a;
return a;
}
bool boolTerm() {
// cout << "{BT(" << pos << ") ";
bool a = notFactor();
while (strstr(exp + pos, "AND") == exp + pos) {
pos += 3;
skipWhite();
bool b = notFactor();
a = a && b;
}
// cout << "BT(" << pos << ")}";
return a;
}
bool boolExpression() {
// cout << "{BE(" << pos << ") ";
bool a = boolTerm();
while (strstr(exp + pos, "OR") == exp + pos) {
pos += 2;
skipWhite();
bool b = boolTerm();
a = a || b;
}
// cout << "BE(" << pos << ")}";
return a;
}
int main(int argc, char *argv[]) {
ifstream fin("bool.in");
fin.getline(exp, 1001);
// cout << exp << endl;
int N;
fin >> N;
char c;
ofstream fout("bool.out");
while (N--) {
fin >> c;
vars[c - 'A'] = !vars[c - 'A'];
pos = 0;
skipWhite();
// for (int i(0); i < 26; ++i)
// cout << vars[i];
// cout << endl;
//cout << eval();
fout << boolExpression();
}
fout << endl;
fout.close();
fin.close();
return 0;
}