Cod sursa(job #181279)

Utilizator me_andyAvramescu Andrei me_andy Data 18 aprilie 2008 10:06:23
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<fstream.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
 ifstream f("bool.in");
 ofstream g("bool.out");
 char sir2[5000],st[5000],*y,polo[5200],sir[5010],x[5100],op[]="()&~|",*p,c='&',c2='|',c3='~',special='?',special2='!';
 char ultima[5110];
 int  vect[27],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(sir,1001);
 n=strlen(sir);
 k=-1;
 for(i=0;i<n;i++)
  {
    ok=0;
    if(sir[i]=='N' &&sir[i+1]=='O' &&sir[i+2]=='T')
  {sir2[++k]=c3;i+=2;ok=1;}
  if(sir[i]=='A' &&sir[i+1]=='N' &&sir[i+2]=='D')
  {sir2[++k]=c;i+=2;ok=1;}
   if(sir[i]=='O' &&sir[i+1]=='R')
   {sir2[++k]=c2;i+=1;ok=1;}
  if(sir[i]=='T' && sir[i+1]=='R' && sir[i+2]=='U' && sir[i+3]=='E')
   { sir2[++k]=special;i+=3;ok=1;}
  if(sir[i]=='F' && sir[i+1]=='A' && sir[i+2]=='L' && sir[i+3]=='S' && sir[i+4]=='E')
   { sir2[++k]=special2;i+=4;ok=1;}
  if(ok==0 && sir[i]!=' ')
   sir2[++k]=sir[i];
  }
 k=-1;
 for(i=0;i<n;i++)
 {
    if(!strchr(op,sir2[i]))
    polo[++k]=sir2[i++];
   switch(sir2[i])
   {
    case '(': push(sir2[i]);break;
    case ')': while((carry=pop())!='(') polo[++k]=carry;break;
    case '&': if(strchr("(|",st[vf]) || (vf==-1)) push(sir2[i]);
	      else if(strchr("~&",st[vf])) {polo[++k]=pop();i--;}break;
    case '~': if(strchr("~",st[vf])){polo[++k]=pop();i--;}
	       else push(sir2[i]);break;
    case '|': if(strchr("(",st[vf]) || (vf==-1)) push(sir2[i]);
	      else if(strchr("~&|",st[vf])) {polo[++k]=pop();i--;}break;
   }

 }
 while((carry=pop())!=0)
  polo[++k]=carry;
  polo[++k]=0;
f.getline(ultima,102);
 okm=atoi(ultima);
 for(i=0;i<=26;i++)
  vect[i]=0;

 f.getline(ultima,102);
 for(i=0;i<okm;i++)
 {
  int po=ultima[i]-'A';
 vect[po]=schimba(vect[po]);
  g<<(evaluare(vect));

 }g<<"\n";
 return 0;
}