Pagini recente » Istoria paginii runda/ojigim_sim17/clasament | Cod sursa (job #1711614) | Cod sursa (job #2233596) | Cod sursa (job #1691944) | Cod sursa (job #2674279)
#include <fstream>
#include <string>
using namespace std;
string sir;
string fin;
/*
0 = 'FALSE';
1 = 'TRUE';
& = 'AND';
! = 'NOT';
| = 'OR';
( = '(';
) = ')';
*/
int var[91];
int pos;
int exp();
int t1();
int t2();
int t3();
int exp()
{
int val = t1();
while (pos < fin.size() && fin[pos] == '|')
{
pos++;
val = (val | t1());
}
return val;
}
int t1()
{
int val = t2();
while (pos < fin.size() && fin[pos] == '&')
{
pos++;
val = (val && t2());
}
return val;
}
int t2()
{
int nr = 0;
while (pos < fin.size() && fin[pos] == '!')
{
pos++;
nr++;
}
if (nr % 2 == 0)
{
return t3();
}
else
{
return (!t3());
}
}
int t3()
{
int val;
if (fin[pos] == '(')
{
pos++;
val = exp();
pos++;
}
else if (fin[pos] == '1')
{
pos++;
return 1;
}
else if (fin[pos] == '0')
{
pos++;
return 0;
}
else
{
pos++;
return var[(int)fin[pos - 1]];
}
return val;
}
int main()
{
ifstream in("bool.in");
ofstream out("bool.out");
getline(in, sir);
for (int i = 0; i < sir.size(); i++)
{
if (sir[i] == '(')
{
fin.push_back('(');
}
else if (sir[i] == ')')
{
fin.push_back(')');
}
else if (i < sir.size() - 1 && sir[i] == 'O' && sir[i + 1] == 'R')
{
fin.push_back('|');
i++;
}
else if (i < sir.size() - 2 && sir[i] == 'N' && sir[i + 1] == 'O' && sir[i + 2] == 'T')
{
fin.push_back('!');
i += 2;
}
else if (i < sir.size() - 2 && sir[i] == 'A' && sir[i + 1] == 'N' && sir[i + 2] == 'D')
{
fin.push_back('&');
i += 2;
}
else if (i < sir.size() - 3 && sir[i] == 'T' && sir[i + 1] == 'R' && sir[i + 2] == 'U' && sir[i + 3] == 'E')
{
fin.push_back('1');
i += 3;
}
else if (i < sir.size() - 4 && sir[i] == 'F' && sir[i + 1] == 'A' && sir[i + 2] == 'L' && sir[i + 3] == 'S' && sir[i + 4] == 'E')
{
fin.push_back('0');
i += 4;
}
else if (sir[i] != ' ')
{
fin.push_back(sir[i]);
}
}
int n;
char c;
in >> n;
for (int i = 1; i <= n; i++)
{
in >> c;
var[(int)c] = 1 - var[(int)c];
pos = 0;
out << exp();
}
return 0;
}