Cod sursa(job #70500)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 6 iulie 2007 10:50:58
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define DELIMITER 1
#define VARIABLE 2
#define NUMBER 3
char expr1[1011],aux[1011],*expr,tok_type,token,c;

int l,i,j,n,val[30],sol,ind;
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);
	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 {expr1[j]=aux[i];i++;j++;}
	}
	expr=expr1;
	fscanf(f,"%d",&n);
	fscanf(f,"%c",&c);
	for(i=1;i<=n;i++)
	{ expr=expr1;
	  fscanf(f,"%c",&c);
	  ind=(int)(c-'A');
	  val[ind]=1-val[ind];
	  eval_exp(&sol);
	  fprintf(g,"%d",sol);
	}
	fprintf(g,"\n");
	fcloseall();
	return 0;
}

void get_token()
{
	tok_type=0;
	if(*expr=='\n') return;
	while(isspace(*expr)) ++expr;
	if(strchr("+-*()",*expr))
	{ tok_type=DELIMITER;
	  token=*expr;
	  expr++;
	}
	else
	 if(isalpha(*expr))
	 { tok_type=VARIABLE;
	   token=*expr;
	   expr++;
	 }
	 else
	  if(isdigit(*expr))
	  { tok_type=NUMBER;
	    token=*expr;
	    expr++;
	  }

}

void atom(int *answer)
{
	if(tok_type==NUMBER)
	{if(token=='1') *answer=1;
	 else *answer=0;
	}
	else
	*answer=val[(int)(token-'A')];
	get_token();
}

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

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