Pagini recente » Cod sursa (job #1164668) | Cod sursa (job #1872259) | Cod sursa (job #3005698) | Cod sursa (job #3157024) | Cod sursa (job #1825415)
#include<cstdio>
#include<cstring>
const int LMAX=1001;
char s[LMAX];
int poz;
bool val['Z'-'A'];
char operatori[2][5]={"AND","OR"},constante[2][7]={"FALSE","TRUE"};
int Operator_tip()
{
for(int i=0;i<2;i++)
if(strncmp(s+poz,operatori[i],strlen(operatori[i]))==0)
return i;
return -1;
}
int Constante_tip()
{
for(int i=0;i<2;i++)
if(strncmp(s+poz,constante[i],strlen(constante[i]))==0)
return i;
return -1;
}
bool Termen();
bool Expresie()
{
bool termen=Termen();
while(s[poz]=='|')
{
if(s[poz]=='|')
{
poz++;
termen=(Termen() || termen);
}
}
return termen;
}
bool Factor()
{
bool semn=false;
while(s[poz]=='!')
{
poz++;
semn=!semn;
}
int valuare=0;
if(s[poz]=='(')
{
poz++;
valuare=Expresie();
if(semn)
valuare=!valuare;
poz++;
return valuare;
}
if(s[poz]=='0' || s[poz]=='1')
{
poz++;
return s[poz-1]-'0';
}
for(char i='A';i<='Z';i++)
if(s[poz]==i)
{
poz++;
if(semn)
return !val[i-'A'];
return val[i-'A'];
}
}
bool Termen()
{
bool factor=Factor();
while(s[poz]=='&')
{
if(s[poz]=='&')
{
poz++;
factor=(Factor() && factor);
}
}
return factor;
}
bool Is_NOT()
{
return strncmp(s+poz,"NOT",strlen("NOT"))==0;
}
int main()
{
FILE *in=fopen("bool.in","r");
fgets(s,sizeof s,in);
int n;
n=strlen(s);
if(s[n-1]=='\n')
s[n-1]='\0';
int j=0;
for(int i=0;i<n;i++)
{
if(s[i]==' ')
continue;
int tip=0;
poz=i;
if((tip=Operator_tip())!=-1)
s[j++]=tip?'|':'&',i+=strlen(operatori[tip])-1;
else
{
if((tip=Constante_tip())!=-1)
s[j++]='0'+tip,i+=strlen(constante[tip])-1;
else
if((tip=Is_NOT()))
s[j++]='!',i+=2;
else
s[j++]=s[i];
}
}
s[j]=NULL;//'\0';
fprintf(stderr,"%s ",s);
fscanf(in,"%d ",&n);
FILE *out=fopen("bool.out","w");
for(int i=1;i<=n;i++)
{
char x;
fscanf(in,"%c ",&x);
val[x-'A']=(!val[x-'A']);
poz=0;
int rasp=Expresie();
fprintf(out,"%d",rasp);
}
fprintf(out,"\n");
}