Cod sursa(job #181199)

Utilizator me_andyAvramescu Andrei me_andy Data 17 aprilie 2008 23:58:19
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#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;
}