Cod sursa(job #71741)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 11 iulie 2007 15:21:57
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.85 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],*prog,varb[26],c;
int vars[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int l,i,j,ok,k,lv,p,sol,n,cc;
char token[80];
char tok_type;

void eval_exp(int *answer);
void eval_exp1(int *answer);
void eval_exp2(int *answer);
void eval_exp3(int *answer);
void eval_exp4(int *answer);
void eval_exp5(int *answer);
void eval_exp6(int *answer);
void atom(int *answer);
void get_token();
void putback();
void serror(int error);
int find_var(char *s);
int isdelim(char cc);


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 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);
	}
	prog=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
	  { prog=expr1;
	    cc=int(c-'A');
	    vars[cc]=1-vars[cc];
	    eval_exp(&sol);
	    fprintf(g,"%d",sol);
	  }
	}
	fprintf(g,"\n");
	fcloseall();
	return 0;
}

void eval_exp(int *answer)
{
	get_token();
	if(!*token)
	{
		serror(2);
		return;
	}
	eval_exp1(answer);
}
void eval_exp1(int *answer)
{
	int slot;
	char ttok_type;
	char temp_token[80];
	if(tok_type==VARIABLE)
	{
		strcpy(temp_token,token);
		ttok_type=tok_type;
		slot=toupper(*token)-'A';
		get_token();
		if(*token!='=')
		{
			putback();
			strcpy(token,temp_token);
			tok_type=ttok_type;
		}
		else
		{
			get_token();
			eval_exp2(answer);
			vars[slot]=*answer;
			return;
		}
	}
	eval_exp2(answer);
}

void eval_exp2(int *answer)
{
	char op;
	int temp;
	eval_exp3(answer);
	while((op=*token)=='+'||op=='#')
	{
		get_token();
		eval_exp3(&temp);
		switch(op)
		{
			case '+':*answer=*answer||temp;break;
			case '#':*answer=*answer||temp;break;
		}
	}
}
void eval_exp3(int *answer)
{
	char op;
	int temp;
	eval_exp4(answer);
	while((op=*token)=='*'||op=='#')
	{
		get_token();
		eval_exp4(&temp);
		switch(op)
		{
			case '*':*answer=*answer&&temp;break;
			case '#':*answer=*answer&&temp;break;
		}
	}
}

void eval_exp4(int *answer)
{
	int temp,ex,t;
	eval_exp5(answer);
	if(*token=='^')
	{
		*answer=*answer+2;
	}
}

void eval_exp5(int *answer)
{
	char op;
	op=0;
	if((tok_type==DELIMITER)&& *token=='-')
	{
	  op=*token;
	  get_token();
	}
	eval_exp6(answer);
	if(op=='-') *answer=1-(*answer);
}

void eval_exp6( int *answer)
{
	if(*token=='(')
	{
		get_token();
		eval_exp2(answer);
		if(*token!=')')
		serror(1);
		get_token();
	}
	else
	atom(answer);
}

void atom(int *answer)
{
	switch(tok_type)
	{
		case VARIABLE: *answer=find_var(token);get_token();return;
		case NUMBER: *answer=atoi(token);get_token();return;
		default : serror(0);
	}
}

void putback()
{
	char *t;
	t=token;
	for(;*t;t++) prog--;
}

void serror(int error)
{
	char *e[]={
	"syntax error",
	"unbalanced parentheses",
	"no expresion present"
	};
	printf("%s\n",e[error]);
}

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

int isdelim(char cc)
{
	if(strchr("+-*()",cc)||cc==9||cc==0)
	return 1;
	return 0;
}
int find_var(char *s)
{
	if(!isalpha(*s))
	{ serror(1);
	  return 0;
	}
	return vars[toupper(*token)-'A'];
}