Pagini recente » Cod sursa (job #2833165) | Cod sursa (job #2924730) | Cod sursa (job #2359585) | Cod sursa (job #2371883) | Cod sursa (job #2192156)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
int evalN();
char exp[1005];
int N;
bool var[30];
int Indice;
int eval()
{
int result = evalN();
while(exp[Indice] == 'A' && exp[Indice+1] == 'N' && exp[Indice+2] == 'D')
{
Indice += 3;
int a = evalN();
result = result && a;
}
return result;
}
int evaluateExpr()
{
int result = eval();
while(exp[Indice] == 'O' && exp[Indice+1] == 'R')
{
Indice += 2;
int a = eval();
result = result || a;
}
return result;
}
int evalN()
{
int result=0;
int snot=0;
while(exp[Indice] == 'N' && exp[Indice+1] == 'O' && exp[Indice+2] == 'T')
{
snot = !snot;
Indice += 3;
}
if (exp[Indice] == '(')
{
Indice++;
result = evaluateExpr();
Indice++;
}
else
{
if (exp[Indice] == 'T' && exp[Indice+1] == 'R' && exp[Indice+2] == 'U' && exp[Indice+3] == 'E')
{
Indice += 4;
return !snot;
}
if (exp[Indice] == 'F' && exp[Indice+1] == 'A' && exp[Indice+2] == 'L' && exp[Indice+3] == 'S' && exp[Indice+4] == 'E')
{
Indice += 5;
return snot;
}
else
{
result = var[exp[Indice]-'A'];
Indice++;
}
}
if (snot)
return !result;
return result;
}
int evaluate(char s[])
{
int finish = strlen(s);
if (finish == 1)
{
return var[s[0]-'A'];
}
else if (strcmp(s, "FALSE") == 0)
{
return 0;
}
else if (strcmp(s, "TRUE") == 0)
{
return 1;
}
char t[finish];
int k=0;
int result = 0;
for(int i=0;i<finish;i++)
{
if (s[i] == ' ')
{
t[k] = 0;
i++;
if (strcmp(t,"AND") == 0)
{
int right = evaluate(s+i);
result = result && right;
}
else if (strcmp(t, "OR") == 0)
{
int right = evaluate(s+i);
result = result || right;
}
else if (strcmp(t, "NOT") == 0)
{
result = !evaluate(s+i);
}
else
{
result = evaluate(t);
}
k = 0;
}
else if (s[i] == '(')
{
t[k] = 0;
result = evaluate(s+i+1);
}
else if (s[i] == ')')
{
t[k] = 0;
return evaluate(t);
}
t[k++] = s[i];
t[k] = 0;
}
return result;
}
int main()
{
char s1[1005];
fin.getline(s1,1005);
int k=0;
for(int i=0;s1[i];i++)
{
if (s1[i] == ' ')
continue;
exp[k++] = s1[i];
}
fin>>N;
char c;
for(int i=1;i<=N;i++)
{
fin>>c;
Indice = 0;
k = c-'A';
var[k] = !var[k];
fout<<evaluateExpr();
}
return 0;
}