Pagini recente » Cod sursa (job #756757) | Cod sursa (job #2941517) | Cod sursa (job #2479521) | Cod sursa (job #779995) | Cod sursa (job #138386)
Cod sursa(job #138386)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
typedef unsigned int uint;
enum Token {
NOT = -1,
OR = -2,
AND = -3,
OB = -5,
CB = -6,
TRUE = -7,
FALSE = -8
};
char exp[1024];
int tl[1024];
bool vars[32];
int pos;
bool boolExpression();
bool factor() {
bool a;
if (tl[pos] >= 0)
a = vars[tl[pos++]];
else if (tl[pos] == NOT) {
++pos;
a = !factor();
} else if (tl[pos] == OB) {
++pos;
a = boolExpression();
++pos;
}
return a;
}
bool boolTerm() {
// cout << "{BT(" << pos << ") ";
bool a = factor();
while (tl[pos] == AND) {
++pos;
bool b = factor();
a = a && b;
}
// cout << "BT(" << pos << ")}";
return a;
}
bool boolExpression() {
// cout << "{BE(" << pos << ") ";
bool a = boolTerm();
while (tl[pos] == OR) {
++pos;
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);
pos = 0;
for (uint i (0); i < strlen(exp); ++i) {
if (exp[i] == ' ')
continue;
switch (exp[i]) {
case 'T':
if ('R' == exp[i+1]) {
tl[pos++] = TRUE;
i += 4;
} else goto letter;
break;
case 'F':
if ('A' == exp[i+1]) {
tl[pos++] = FALSE;
i += 4;
} else goto letter;
break;
case 'N':
if ('O' == exp[i+1]) {
tl[pos++] = NOT;
i += 2;
} else goto letter;
break;
case 'O':
if ('R' == exp[i+1]) {
tl[pos++] = OR;
i += 1;
} else goto letter;
break;
case 'A':
if ('N' == exp[i+1]) {
tl[pos++] = AND;
i += 2;
} else goto letter;
break;
case '(':
tl[pos++] = OB;
break;
case ')':
tl[pos++] = CB;
break;
default:
letter:
tl[pos++] = exp[i] - 'A';
}
}
tl[pos] = -888;
/*for (int i(0); tl[i] != -888; ++i)
cout << tl[i] << " ";
cout << endl;*/
// 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;
// for (int i(0); i < 26; ++i)
// cout << vars[i];
// cout << endl;
fout << boolExpression();
}
fout << endl;
fout.close();
fin.close();
return 0;
}