Pagini recente » Cod sursa (job #3172126) | Cod sursa (job #467917) | Cod sursa (job #194359) | Cod sursa (job #2847422) | Cod sursa (job #1669414)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
struct nod
{
char info;
nod *st,*dr;
nod()
{
this->st=NULL;
this->dr=NULL;
}
};
nod *r;
char s[1010];
int n,i,v[35];
void exp(nod *&r);
void ad(nod *&r);
void nr(nod *&r);
void exp(nod *&r)
{
nod *p;
ad(r);
p=r;
while(s[i]=='|')
{
r=new nod;
r->info='|';
i++;
r->st=p;
ad(r->dr);
p=r;
}
}
void ad(nod *&r)
{
nod *p;
nr(r);
p=r;
while(s[i]=='&')
{
r=new nod;
r->st=p;
r->info='&';
i++;
nr(r->dr);
p=r;
}
}
void nr(nod *&r)
{
if(s[i]=='(')
i++,exp(r),i++;
else
{
if(s[i]!='!')
{
r=new nod;
r->info=s[i];
i++;
}
else
{
r=new nod;
r->info='!';
i++;
exp(r->st);
}
}
}
int sdr(nod *r)
{
if(r!=NULL)
{
if(r->info=='|')
{
int a=sdr(r->st);
int b=sdr(r->dr);
return a | b;
}
else
if(r->info=='&')
{
int a=sdr(r->st);
int b=sdr(r->dr);
return a & b;
}
else
if(r->info=='!')
{
int a=sdr(r->st);
return !a;
}
else
if(r->info=='1')
return 1;
else
if(r->info=='0')
return 0;
else
return v[r->info-'A'];
}
}
void rsd(nod *r)
{
if(r!=NULL)
{
cout<<r->info<<' ';
rsd(r->st);
rsd(r->dr);
}
}
int j;
int main()
{
f.getline(s,1000);
n=strlen(s);
for(i=0;i+1<n;i++)
{
if(s[i]=='O' && s[i+1]=='R')
{
s[i]='|';
for(j=i+1;j<n-1;++j)
s[j]=s[j+1];
--n;i--;
}
else
if(s[i]=='A' && s[i+1]=='N')
{
s[i]='&';
for(j=i+1;j<n-2;++j)
s[j]=s[j+2];
n-=2;i--;
}
else
if(s[i]=='N' && s[i+1]=='O')
{
s[i]='!';
for(j=i+1;j<n-2;++j)
s[j]=s[j+2];
n-=2;i--;
}
else
if(s[i]=='T' && s[i+1]=='R')
{
s[i]='1';
for(j=i+1;j<n-3;++j)
s[j]=s[j+3];
n-=3;i--;
}
else
if(s[i]=='F' && s[i+1]=='A')
{
s[i]='0';
for(j=i+1;j<n-4;++j)
s[j]=s[j+4];
n-=4;i--;
}
else
if(s[i]==' ')
{
for(j=i;j<n-1;++j)
s[j]=s[j+1];
--n;i--;
}
}
i=0;
exp(r);
f>>n;
char x;
for(i=1;i<=n;i++)
{
f>>x;
v[x-'A']=!v[x-'A'];
g<<sdr(r);
}
}