Cod sursa(job #182017)

Utilizator katakunaCazacu Alexandru katakuna Data 20 aprilie 2008 10:37:06
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<stdio.h>

int y,n,t,i;
char *p,v[10000],x,T[100],nr,V[150],l,R;


int oor(int a,int b){

  if(a==1||b==1)
  return 1;


return 0;
}


int aand(int a,int b){

if(a==0||b==0)
return 0;

return 1;
}


int nnot(int a,int b){

if (a==100)
return 100;

if(b==0)
return 1;

return 0;
}




int AND();
int NOT();
int FACT();


int OR(){
int r;

r=AND();


  while(*p=='|'){
  p++;
   r = oor(r,AND());
  }


return r;
}




int AND(){
int r;

 r=NOT();

  while(*p=='&'){
  p++;
  r = aand(r,NOT());
  }

return r;
}



int NOT(){
int r;

 r=FACT();

  while(*p=='!'){
  p++;
  r = nnot(0,FACT());
  }


return r;
}


int FACT(){
int r=0;

  if(*p=='('){
  p++;
  r = OR();
  p++;
  }

  else{
  y=*p;
  r=V[y];
  p++;
  }

return r;
}





int main(){

//v[0]='0';


FILE *f=fopen("bool.in","r");

fscanf(f,"%c",&x);

n=-1;

int ok=1;

  while(!feof(f)&&x!='\n'){


  if(!ok)
  break;

   if(x=='('||x==')'){
   n++;
   v[n]=x;
   }


   if(x>='A'&&x<='Z'){
   t=0;

     while(x>='A'&&x<='Z'){
     t++;
     T[t]=x;
     fscanf(f,"%c",&x);

       if(x=='\n')
       ok=0;

     }



     if(t==1){
     n++;
     v[n]=T[1];
     }

     if(T[1]=='T'&&T[4]=='E'){
     n++;
     v[n]='1';
     }


     if(T[1]=='A'&&T[3]=='D'){
     n++;
     v[n]='&';
     }


     if(T[1]=='F'&&T[5]=='E'){
     n++;
     v[n]='0';
     }


     if(T[1]=='O'&&T[2]=='R'){
     n++;
     v[n]='|';
     }


     if(T[1]=='N'&&T[3]=='T'){
     n++;
     v[n]='0';
     n++;
     v[n]='!';
     }


     if(x=='('||x==')'){
     n++;
     v[n]=x;
     }


     for(i=1;i<=10;i++)
     T[i]=0;


     if(!ok)
     break;


   }

  if(!ok)
  break;


  fscanf(f,"%c",&x);
  }

FILE *g=fopen("bool.out","w");
fscanf(f,"%d\n",&nr);

V[49]=1;

    for(l=1;l<=nr;l++){
    fscanf(f,"%c",&x);
    V[x]=!V[x];

    p=v;

    R=OR();

    fprintf(g,"%d",R);
    }

fclose(f);
fclose(g);


return 0;
}