Pagini recente » Cod sursa (job #1583971) | Istoria paginii runda/prelungitoare | Cod sursa (job #710005) | Cod sursa (job #2294945) | Cod sursa (job #577817)
Cod sursa(job #577817)
#include <fstream>
using namespace std;
const int N=1023;
int poz,n;
bool v[200];
char s[N],r[N];
bool expresie(),termen(),factor();
ifstream in("bool.in");
ofstream out("bool.out");
inline bool litera(char c)
{
return c=='a' || c=='f' || c>='A' && c<='Z';
}
inline char next(int &x)
{
while (r[x]==' ')
x++;
if (litera(r[x]) && !litera(r[x+1]) || r[x]=='(' || r[x]==')')
return r[x++];
if (r[x]=='N')
{
x+=3;
return '!';
}
if (r[x]=='A')
{
x+=3;
return '&';
}
if (r[x]=='O')
{
x+=2;
return '|';
}
if (r[x]=='T')
{
x+=4;
return 'a';
}
x+=5;
return 'f';
}
bool expresie()
{
bool val=termen();
while (s[poz]=='|')
{
poz++;
val|=termen();
}
return val;
}
bool termen()
{
bool val=factor();
while (s[poz]=='&')
{
poz++;
val&=factor();
}
return val;
}
bool factor()
{
bool sgn=false;
while(s[poz]=='!')
{
poz++;
sgn=!sgn;
}
if (s[poz]=='(')
{
++poz;
sgn^=expresie();
++poz;
return sgn;
}
return v[s[poz++]-'A']^sgn;
}
int main()
{
int x,i;
in.getline(r,N);
for (i=0;r[i];)
s[++n]=next(i);
in>>x;
in>>r+1;v['a'-'A']=true;
for (i=1;i<=x;i++)
{
v[r[i]-'A']=!v[r[i]-'A'];
poz=1;
out<<expresie();
}
out<<"\n";
return 0;
}