Cod sursa(job #179841)

Utilizator katakunaCazacu Alexandru katakuna Data 16 aprilie 2008 13:25:49
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>
#include<string.h>


int y;

int or(int a,int b){

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

return 0;
}


int and(int a,int b){

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

return 1;
}


int not(int a,int b){

if(a==1){
b++;
b--;
}

if(b==0)
return 1;

return 0;
}


char x,v[11000],*p=v,t[100];
int V[200],k,z,i,n;

int termen();
int fact();
int fact2();



int eval(){
int r = termen();

  while(*p=='|'){
  p++;
  r=or(r,termen());
  }


return r;
}


int termen(){
int r=fact();

  while(*p=='&'){
  p++;
  r = and(r,fact());
  }

return r;
}


int fact(){

int r=fact2();

  while(*p=='!'){
  p++;
  r = not(0,fact2());
  }

return r;
}


int fact2(){
int r=0;

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

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

return r;
}



int main(){

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

k=-1;
fscanf(f,"%c",&x);

  while(x!='\n'){


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

    else{
    z=-1;

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


      if(strcmp(t,"TRUE")==0){
      k++;
      v[k]='1';
      }

      if(strcmp(t,"FALSE")==0){
      k++;
      v[k]='0';
      }

      if(strcmp(t,"AND")==0){
      k++;
      v[k]='&';
      }

      if(strcmp(t,"OR")==0){
      k++;
      v[k]='|';
      }

      if(strcmp(t,"NOT")==0){
      k++;
      v[k]='0';
      k++;
      v[k]='!';
      }

      if(z==0){
      k++;
      v[k]=t[0];
      }


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




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


    }

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


FILE *g=fopen("bool.out","w");

fscanf(f,"%d\n",&n);

int R;

  for(i=1;i<=n;i++){
  fscanf(f,"%c",&x);
  p=v;
  V[x]=!V[x];

  R=eval();

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

  }


fclose(f);
fclose(g);

return 0;
}