Cod sursa(job #79797)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 23 august 2007 20:51:03
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
char aux[1010],expr1[1010],varb[30],reg[110],ccc;
int n,l,i,j,lv,ok,k,sol,ii,
vars[32]={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,0,0,0,0,0,0};
int  eval(int ll,int rr);
void change(char ch);
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++;
		     }

	}
	l=strlen(expr1);
	fscanf(f,"%d",&n);
	fscanf(f,"%c",&ccc);
	sol=eval(0,l-2);
	fgets(reg,n+1,f);
	for(i=0;i<n;i++)
	{ if(strchr(varb,reg[i]))
	  { change(reg[i]);sol=eval(0,l-2);}
	  fprintf(g,"%d",sol);
	}
	fprintf(g,"\n");
	fcloseall();
	return 0;
}

int  eval(int ll,int rr)
{
    int par,por,pand;
    par=0;
    por=0;
    pand=0;
    if(ll==rr)
    { if(expr1[ll]=='1') return 1;
      if(expr1[ll]=='0') return 0;
      return vars[(int)(toupper(expr1[ll])-'A')];
    }
    for(ii=ll;ii<=rr;ii++)
    {
       if(expr1[ii]=='(')par++;
       if(expr1[ii]==')')par--;
       if(expr1[ii]=='+')
	if(!par){ por=ii;break;}
       if(expr1[ii]=='*')
	if(!par)
	 if(!pand)
	  pand=ii;
    }
    if(por) return eval(ll,por-1)||eval(por+1,rr);
    if(pand) return eval(ll,pand-1)&&eval(pand+1,rr);
    if(expr1[ll]=='(') return eval(ll+1,rr-1);
    return 1-eval(ll+1,rr);
}

void change(char ch)
{
   int slot;
   slot=0;
   slot=(int)(toupper(ch)-'A');
   vars[slot]=1-vars[slot];
}