Pagini recente » Cod sursa (job #50011) | Cod sursa (job #671111) | Borderou de evaluare (job #275087) | Cod sursa (job #1814321) | Cod sursa (job #2561989)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
vector <int> v[30];
string a, b;
int n, i;
bool ok;
bool eval();
int main()
{
getline(fin, a);
fin >> n;
b = "";
for (int i = 0; i < a.size(); ++i)
{
string c = "";
int poz_start = -1, cnt = 0;
bool ok = false;
while (i < a.size() && a[i] != ' ')
{
if (a[i] != '(' && a[i] != ')')
{
if (ok == 0) poz_start = i;
ok = true;
c += a[i];
}
else if (a[i] == '(') b += a[i];
else cnt++;
++i;
}
if (c == "AND")
b += '&';
else if (c == "OR")
b += '|';
else if (c == "NOT")
b += '!';
else if (c == "TRUE")
b += '1';
else b += '0';
if (c.size() == 1)
v[c[0] - 'A'].push_back(b.size() - 1);
while (cnt)
{
b += ')';
cnt--;
}
}
char c;
while(n--)
{
fin >> c;
i = c - 'A';
for (size_t j = 0; j < v[i].size(); ++j)
b[v[i][j]] = (b[v[i][j]] == '0') + '0';
i = 0;
fout << eval();
}
return 0;
}
bool eval()
{
bool ok;
while (i < b.size())
{
if (isdigit(b[i]))
{
ok = b[i] - '0';
++i;
}
else if (b[i] == '(')
{
++i;
ok = eval();
}
else if (b[i] == '!')
{
++i;
ok = !eval();
}
else if (b[i] == '&')
{
++i;
ok &= eval();
}
else if (b[i] == '|')
{
++i;
ok |= eval();
}
else break;
}
return ok;
}