Cod sursa(job #71708)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 11 iulie 2007 13:38:59
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.26 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
char expr1[1011],aux[1011],varb[28],*expr,token,c;
int l,i,j,n,val[250],sol,ind,p,ok,lev[1011],opp[1011],lmax,lv,k;
void get_token();
void atom(int *answer);
void eval_exp(int *answer);
void eval_exp1(int *answer);//evalueaza OR=+
void eval_exp2(int *answer);//evalueaza AND=*
void eval_exp3(int *answer);//evalueaza NOT=-
void eval_exp4(int *answer);//evalueaza ()
int main()
{
	FILE *f,*g;
	f=fopen("bool.in","r");
	g=fopen("bool.out","w");
	fgets(aux,1002,f);
	l=strlen(aux);
	lv=0;
	while(i<l)
	{       if(aux[i]==' ')i++;
		else if(aux[i]=='T'&&aux[i+1]=='R'){expr1[j]='1';i=i+4;j++;}
		else if(aux[i]=='F'&&aux[i+1]=='A'){expr1[j]='0';i=i+5;j++;}
		else if(aux[i]=='O'&&aux[i+1]=='R'){expr1[j]='+';i=i+2;j++;}
		else if(aux[i]=='A'&&aux[i+1]=='N'){expr1[j]='*';i=i+3;j++;}
		else if(aux[i]=='N'&&aux[i+1]=='O'){expr1[j]='-';i=i+3;j++;}
		else if(aux[i]==')'){expr1[j]=aux[i];i++;j++;}
		else if(aux[i]=='('){expr1[j]=aux[i];i++;j++;}
		else if(aux[i]=='\n'){expr1[j]=aux[i];i++;j++;}
		else { ok=1;
		       for(k=0;k<=lv;k++)
			if(aux[i]==varb[k]){ ok=0;break;}
		       if(ok) {varb[lv]=aux[i];lv++;}
		       expr1[j]=aux[i];i++;j++;
		     }

	}
	ok=1;
	while(ok)
	{  ok=0;
	   p=0;
	   for(i=0;i<=l+1;i++)
	   { if(expr1[i]=='('&&expr1[i+2]==')')
	     { expr1[p]=expr1[i+1];p++;i++;i++;ok=1;}
	     else
	      if(expr1[i]=='-')
	      { if(expr1[i+1]=='0'){expr1[p]='1';i++;p++;ok=1;}
		 else
		  if(expr1[i+1]=='1'){expr1[p]='0';i++;p++;ok=1;}
		   else
		     if(expr1[i+1]=='-')
		       {i++;ok=1;}
			else  {expr1[p]=expr1[i];p++;}
	      }
	      else  {expr1[p]=expr1[i];p++;}
	   }
	   l=strlen(expr1);
	}
	expr=expr1;
        eval_exp(&sol);
	fscanf(f,"%d",&n);
	fscanf(f,"%c",&c);
	for(i=1;i<=n;i++)
	{ fscanf(f,"%c",&c);
	  if(!strchr(varb,c))
	  fprintf(g,"%d",sol);
	  else
	  { expr=expr1;
	    val[c]=1-val[c];
	    eval_exp(&sol);
	    fprintf(g,"%d",sol);
          }
	}
	fprintf(g,"\n");
	fcloseall();
	return 0;
}

void get_token()
{       if(*expr=='\n') return;
	token=*expr;
	expr++;
}
void atom(int *answer)
{
	if(token=='1')
	{ *answer=1;get_token();return;}
	if(token=='0')
	{ *answer=0;get_token();return;}
	if('A'<token&&token<'Z')
	{*answer=val[token];get_token();}
}

void eval_exp(int *answer)//initializeaza evaluarea
{
	get_token();
	eval_exp1(answer);
}

void eval_exp1(int *answer)//evalueaza OR=+
{
     int temp;
     char op;
     eval_exp2(answer);
     op=token;
     while(op=='+')
     {
       get_token();
       eval_exp2(&temp);
       *answer=*answer||temp;
       op=token;
     }
}
void eval_exp2(int *answer)//evalueaza AND=*
{
     int temp;
     char op;
     eval_exp3(answer);
     op=token;
     while(op=='*')
     {
       get_token();
       eval_exp3(&temp);
       *answer=*answer&&temp;
       op=token;
     }
}

void eval_exp3(int *answer)//evalueaza NOT=-
{
	char op;
	eval_exp4(answer);
	op=token;
	while(op=='-')
	{
	 get_token();
	 eval_exp4(answer);
	 *answer=!(*answer);
	 op=token;
	}
}
void eval_exp4(int *answer)//evalueaza ()
{
	if(token=='(')
	{ get_token();
	  eval_exp1(answer);
	  get_token();
	}
	else
	atom(answer);
}