Cod sursa(job #130569)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 1 februarie 2008 15:36:06
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<stdio.h>
#include<string.h>
char aux[1100],reg[110];
int l,i,j,n,sol,cc,poz,c[1100],val[60],fr[60];
int variabila();
int pard();
int negatie();
int conjunctie();
int disjunctie();
int main()
{
    FILE *f,*g;f=fopen("bool.in","r");g=fopen("bool.out","w");
    fgets(aux,1001,f);l=strlen(aux);
    while(i<l)
    { if(aux[i]=='T'&&aux[i+1]=='R'){c[j]=1;i=i+4;j++;}//TRUE=1
      else if(aux[i]=='F'&&aux[i+1]=='A'){c[j]=0;i=i+5;j++;}//FALSE=0;
      else if(aux[i]=='O'&&aux[i+1]=='R'){c[j]=40;i=i+2;j++;}//OR=40
      else if(aux[i]=='A'&&aux[i+1]=='N'){c[j]=41;i=i+3;j++;}//AND=41
      else if(aux[i]=='N'&&aux[i+1]=='O'){c[j]=42;i=i+3;j++;}//NOT=42
      else if(aux[i]==')'){c[j]=50;i++;j++;}// )=50
      else if(aux[i]=='('){c[j]=51;i++;j++;}// (=51
      else if(aux[i]>='A'&&aux[i]<='Z'){c[j]=(int)(aux[i]-'A'+2);fr[c[j]]=1;i++;j++;}
      else i++;
    }
    val[1]=1;
    fscanf(f,"%d",&n);
    fscanf(f,"%s",reg);
    sol=variabila();
    for(i=0;i<n;i++)
    { cc=(int)(reg[i]-'A'+2);
      if(fr[cc]){val[cc]=1-val[cc];poz=0;sol=disjunctie();}
      fprintf(g,"%d",sol);
    }
    fprintf(g,"\n");
    fcloseall();
    return 0;
}
int variabila()
{
	int aux;
	if(c[poz]<40){aux=val[c[poz]];poz++;}
	else aux=negatie();
	return aux;
}
int negatie()
{
	int aux;
	if(c[poz]==42)
	 { if(c[poz+1]!=42){poz++;aux=!variabila();}
	   else {poz+=2;aux=variabila();}
	 }
	else aux=pard();
	return aux;
}
int pard()
{
	int aux=0;
	if(c[poz]==51)
	{ poz++;aux=disjunctie();poz++;}
	else aux=disjunctie();
	return aux;
}
int conjunctie()
{
	int aux;
	aux=variabila();
	while(c[poz]==41)
	{ poz++;aux&=variabila();}
	return aux;
}
int disjunctie()
{
	int aux;
	aux=conjunctie();
	while(c[poz]==40)
	{ poz++;aux|=conjunctie();}
	return aux;
}