Pagini recente » Borderou de evaluare (job #2315956) | Cod sursa (job #1751637) | Borderou de evaluare (job #1514957) | Cod sursa (job #773140) | Cod sursa (job #2292802)
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
int N, l;
char s[1005];
bool charVal[32];
bool EvalExp(int &p); ///ORs
bool Ands(int &p); ///ANDs
bool Nots(int &p); ///NOTs, Brackets, Letters, Constants
bool EvalExp(int &p)
{
while(s[p] == ' ')
p++;
bool ans = Ands(p);
while((p < l - 1 && (s[p] == 'O' && s[p + 1] == 'R')))
{
p += 2;
ans = ans | Ands(p);
}
while(s[p] == ' ')
p++;
return ans;
}
bool Ands(int &p)
{
while(s[p] == ' ')
p++;
bool ans = Nots(p);
while((p < l - 2 && (s[p] == 'A' && s[p + 1] == 'N' && s[p + 2] == 'D')))
{
p += 3;
ans = ans & Nots(p);
}
while(s[p] == ' ')
p++;
return ans;
}
bool Nots(int &p)
{
while(s[p] == ' ')
p++;
bool ans;
if(p < l - 2 && (s[p] == 'N' && s[p + 1] == 'O' && s[p + 2] == 'T'))
{
p += 3;
ans = !Nots(p);
}
else if(s[p] == '(')
{
p++;
ans = EvalExp(p);
p++;
}
else if(p < l - 3 && (s[p] == 'T' && s[p + 1] == 'R' && s[p + 2] == 'U' && s[p + 3] == 'E'))
{
p += 4;
ans = 1;
}
else if(p < l - 4 && (s[p] == 'F' && s[p + 1] == 'A' && s[p + 2] == 'L' && s[p + 3] == 'S' && s[p + 4] == 'E'))
{
p += 5;
ans = 0;
}
else
{
ans = charVal[s[p] - 'A'];
p++;
}
while(s[p] == ' ')
p++;
return ans;
}
int main()
{
fin.getline(s, sizeof(s));
l = strlen(s);
char c;
fin >> N;
for(int i = 1; i <= N; i++)
{
fin >> c;
charVal[c - 'A'] = !charVal[c - 'A'];
int p = 0;
fout << EvalExp(p);
}
return 0;
}