Pagini recente » Cod sursa (job #186247) | Cod sursa (job #3346973) | Cod sursa (job #226984) | Cod sursa (job #725629) | Cod sursa (job #3338778)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int N=1e3;
int n, p, cnt;
char init[N+1], litere[N+1], s[N+1];
bool aux[32];
///imi trebuie multiple expresii
///valoare (true sau false), litera mare, () expresie logica, not e minus cum ar veni, and, or - prioritate minima
bool factor();
bool expresie_and();
bool expresie_or()
{
bool current=expresie_and();
while (s[p]=='|')
{
current = (expresie_and() || current);
p++;
}
return current;
}
bool expresie_and()
{
bool current=factor();
while (s[p]=='&')
{
current = (factor() && current);
p++;
}
return current;
}
bool factor()
{
bool val=true;
int semn = 1;
while (s[p] == '-')
{
p++;
semn = -semn;
}
if (s[p]== '(')
{
p++;
val=expresie_or();
p++;
if (!semn)
{
val=(!val);
}
return val;
}
if (s[p]=='0')
{
p++;
return false;
}
if (s[p]=='1')
{
p++;
return true;
}
int poz=s[p] - 'A';
p++;
val=aux[poz];
if (!semn)
{
val = (!val);
}
return val;
}
///voi modifica sirul astfel incat voi avea & - AND, OR - |, NOT = -, TRUE = 1, FALSE = 0;
void modificare()
{
int i=0;
while (i<strlen(init))
{
if (init[i]>='A' && init[i]<='Z' && (init[i+1] == ')'|| init[i+1]==' '))
{
s[cnt]=init[i];
i++;
cnt++;
//s.insert(i, (char)(s[p] - 'A' + 2));
}
else if (init[i] == 'T' && init[i+1] == 'R')
{
//strcpy(s+i, s+i+4);
//s.insert(i, '1');
s[cnt] = '1';
cnt++;
i+=4;
}
else if (init[i] == 'F' && init[i+1] == 'A')
{
//strcpy(s+i, s+i+5);
//s.insert(i, '0');
s[cnt] = '0';
cnt++;
i+=5;
}
else if (init[i]=='N' && init[i+1] == 'O')
{
s[cnt] = '-';
i+=3;
}
else if (init[i] == '(' || init[i] == ')')
{
if (init[i]=='(')
s[cnt] = '(';
else s[cnt] = ')';
cnt++;
i++;
}
else if (init[i]=='O' && init[i+1] == 'R')
{
s[cnt] = '|';
cnt++;
i+=2;
}
else if (init[i]=='A' && init[i+1] == 'N')
{
s[cnt]='&';
i+=3;
}
else i++;
}
}
int main()
{
in.get(init, N+1);
modificare();
in >> n;
in >> litere;
modificare();
for (int i=0; i<n; i++)
{
aux[(litere[i]-'A')]=!aux[(litere[i]-'A')];
p=0;
out<<expresie_or();
}
return 0;
}