Pagini recente » Cod sursa (job #3171308) | Cod sursa (job #1608371) | Cod sursa (job #226916) | Cod sursa (job #543016) | Cod sursa (job #84431)
Cod sursa(job #84431)
using namespace std;
#include<fstream>
#include<string.h>
int a[30];
int is_alpha(char x)
{
return (x>='A'&&x<='Z');
}
int grad(char x)
{
if(x=='@') return 0;
if(x=='|') return 1;
if(x=='&') return 2;
return 3;
}
int val(char x)
{
if(is_alpha(x))
return a[x-'A'+1];
return (x-'0');
}
int eval(char s[])
{
//caut paranteze in interior pe care le evaluez
int li,lf,cat,i,n;
char aux[1000],naux;
for(li=0;s[li];li++)
if(s[li]=='(')
{
//caut unde se termina
lf=li+1;
cat=1;
naux=-1;
while(!(s[lf]==')'&&cat==1))
{
if(s[lf]=='(') cat++;
if(s[lf]==')') cat--;
aux[++naux]=s[lf];
lf++;
}
aux[naux+1]=0;
s[li]=eval(aux)+'0';
i=li+1;lf++;
while(s[lf])
{
s[i]=s[lf];
i++;lf++;
}
s[i]=0;
}
//evaluare expresie
//caut de fiecare data operatorul cu cea mai mare precedenta
n=li-1;
int poz,k,q;
char min;
while(n)
{
min='@';
for(i=0;s[i];i++)
if(is_alpha(s[i])==0&&s[i]!='0'&&s[i]!='1'&&s[i]!='('&&s[i]!=')')
{
if(grad(min)<grad(s[i]))
{
poz=i;
min=s[i];
}
else
if(grad(min)==grad(s[i])&&grad(min)==3&&i==poz+1)
poz=i;
}
if(min=='!')
{
k=val(s[poz+1]);
k^=1;
s[poz]=k+'0';
for(i=poz+1;i<=n;i++) s[i]=s[i+1];
n--;
}
else
{
k=val(s[poz-1]);
q=val(s[poz+1]);
if(min=='&')
k&=q;
else k|=q;
s[poz-1]=k+'0';
for(i=poz;i<n;i++) s[i]=s[i+2];
n-=2;
}
}
return (s[0]-'0');
}
int main()
{
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],v[1005],cop[1005];
int i,n=-1,nr;
fin.get(s,1005);
for(i=0;s[i];i++)
if(s[i]!=' ')
{
if(is_alpha(s[i])&&is_alpha(s[i+1]))
{
if(s[i]=='N')
v[++n]='!',i+=2;
else
if(s[i]=='A')
v[++n]='&',i+=2;
else
if(s[i]=='O')
v[++n]='|',i++;
else
if(s[i]=='F')
v[++n]='0',i+=4;
else
if(s[i]=='T')
v[++n]='1',i+=3;
}
else
v[++n]=s[i];
}
v[n+1]=0;
memset(a,0,sizeof a);
fin>>nr;
fin.get();
fin.get(s,1005);
for(i=0;i<nr;i++)
{
a[s[i]-'A'+1]^=1;
strcpy(cop,v);
fout<<eval(cop);
}
fout<<"\n";
fin.close();
fout.close();
return 0;
}