Pagini recente » Cod sursa (job #1011617) | Cod sursa (job #1793224) | Cod sursa (job #1180946) | Cod sursa (job #1581879) | Cod sursa (job #181199)
Cod sursa(job #181199)
#include<fstream.h>
#include<string.h>
#include<ctype.h>
ifstream f("bool.in");
ofstream g("bool.out");
char sir2[10000],st[12000],*y,polo[12000],sir[11000],x[11000],op[]="()&~|",*p,c='&',c2='|',c3='~',special='?',special2='!';
char ultima[11001];
int vect[12000],okm,ok,k,i,n,vf=-1,carry,st2[12000];
int schimba(int c)
{
if(c==0) return 1;
return 0;
}
int ssau(int a,int b)
{
if(a!=0 || b!=0) return 1;
return 0;
}
int ssi(int a,int b)
{
if(a==1 && b==1) return 1;
return 0;
}
int nsot(int a)
{
if(a==0) return 1;
return 0;
}
int evaluare(int vect[27])
{
int i,l=0,k;
k=strlen(polo);
for(i=0;i<k;i++)
{
if(polo[i]==special)
st2[++l]=1;
if(polo[i]==special2)
st2[++l]=0;
if(isalpha(polo[i]))
st2[++l]=vect[polo[i]-'A'];
switch (polo[i])
{
case '|':st2[l-1]=ssau(st2[l-1],st2[l]);l--;break;
case '&':st2[l-1]=ssi(st2[l-1],st2[l]);l--;break;
case '~':st2[l]=nsot(st2[l]);break;
}
}
return st2[1];
}
char pop()
{
if(st[vf]>=0) return st[vf--];
return 0;
}
void push(char c)
{
st[++vf]=c;
}
int main()
{
f.getline(x,1001);
k=0;
y=strtok(x," ");
ok=0;
if(strcmp(y,"AND")==0)
{ sir[k++]=c;sir[k]=0;ok=1;}
if(strcmp(y,"OR")==0)
{ sir[k++]=c2;sir[k]=0;ok=1;}
if(strcmp(y,"NOT")==0)
{ sir[k++]=c3;sir[k]=0;ok=1;}
if(ok==0)
{ strcat(sir,y);k+=strlen(y);}
while((y=strtok(NULL," ")))
{
ok=0;
if(strcmp(y,"AND")==0)
{ sir[k++]=c;sir[k]=0;ok=1;}
if(strcmp(y,"OR")==0)
{ sir[k++]=c2;sir[k]=0;ok=1;}
if(strcmp(y,"NOT")==0)
{ sir[k++]=c3;sir[k]=0;ok=1;}
if(ok==0)
{ strcat(sir,y);k+=strlen(y);}
}
n=k;
k=-1;
for(i=0;i<=n;i++)
{
if(sir[i]=='T' && sir[i+1]=='R' && sir[i+2]=='U' && sir[i+3]=='E')
{ polo[++k]=special;i+=4;}
if(sir[i]=='F' && sir[i+1]=='A' && sir[i+2]=='L' && sir[i+3]=='S' && sir[i+4]=='E')
{ polo[++k]=special2;i+=5;}
if(!strchr(op,sir[i]))
polo[++k]=sir[i++];
switch(sir[i])
{
case '(': push(sir[i]);break;
case ')': while((carry=pop())!='(') polo[++k]=carry;break;
case '&': if(strchr("(|",st[vf]) || (vf==-1)) push(sir[i]);
else if(strchr("~&",st[vf])) {polo[++k]=pop();i--;}break;
case '~': push(sir[i]);break;
case '|': if(strchr("(",st[vf]) || (vf==-1)) push(sir[i]);
else if(strchr("~&|",st[vf])) {polo[++k]=pop();i--;}break;
}
}
while((carry=pop())!=0)
polo[++k]=carry;
polo[++k]=0;
f>>okm;
for(i=0;i<=26;i++)
vect[i]=0;
f.getline(ultima,101); f.getline(ultima,101);
for(i=0;i<okm;i++)
{
vect[ultima[i]-'A']=schimba(vect[ultima[i]-'A']);
g<<(evaluare(vect));
}g<<"\n";
return 0;
}