Cod sursa(job #79766)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 23 august 2007 19:53:16
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
struct nod{
char r;
nod *s;
nod *d;
};
char expr1[1011],expr2[1011],*p,c;
int l,i,j,n,val[30];
nod *arb;
void constr(nod *aarb,char *pp);
int eval(nod *aarb);
int main()
{
	FILE *f,*g;f=fopen("bool.in","r");g=fopen("bool.out","w");
	fgets(expr2,1002,f);l=strlen(expr2);
	while(i<l)
	{if(expr2[i]==' ')i++;
	 else if(expr2[i]=='T'&&expr2[i+1]=='R'){expr1[j]='@';i=i+4;j++;}
	 else if(expr2[i]=='F'&&expr2[i+1]=='A'){expr1[j]='?';i=i+5;j++;}
	 else if(expr2[i]=='O'&&expr2[i+1]=='R'){expr1[j]='+';i=i+2;j++;}
	 else if(expr2[i]=='A'&&expr2[i+1]=='N'){expr1[j]='*';i=i+3;j++;}
	 else if(expr2[i]=='N'&&expr2[i+1]=='O'){expr1[j]='-';i=i+3;j++;}
	 else {expr1[j]=expr2[i];i++;j++;}
	}
	expr1[j-1]=0;
	p=&expr1[0];
	arb=new nod;
	constr(arb,p);
	fscanf(f,"%d",&n);
	for(i=1;i<=n;i++)
	 { fscanf(f,"%c",&c);
	   j=(int)(c-'?');
	   val[j]=!val[j];
	   j=eval(arb);
	   fprintf(g,"%d",j);
         }
	fprintf(g,"\n");
	fcloseall();
	return 0;
}
void constr(nod *aarb,char *pp)
{
     nod *ss,*dd;
     char *ps,*pv,*orr;
     long int niv;
     ss=new nod;dd=new nod;
     ps=pp;pv=pp;niv=0;orr=0;
     while(*pv)
     {
	if(*pv=='(') niv++;
	 else
	  if(*pv==')') niv--;
	   else
	    if(!niv)
	      { if(*pv=='*') {if(!orr) orr=pv;}
		 else
		  if(*pv=='+')
		   { aarb->r='+';
		     *pv=0;pv++;
		     constr(ss,ps);aarb->s=ss;
		     constr(dd,pv);aarb->d=dd;
		     return;
		   }
	      }
	pv++;
     }
     if(orr)
      { aarb->r='*';
	*orr=0;orr++;
	 constr(ss,ps);aarb->s=ss;
	 constr(dd,orr);aarb->d=dd;
	 return;
      }
     if(*ps=='(')
     { pv--;*pv=0;
       ps++;
       constr(aarb,ps);
       return;
     }
     if(*ps=='-')
      { aarb->r='-';
	ps++;
	constr(ss,ps);aarb->s=ss;
	dd=0;aarb->d=dd;
	return;
      }
     aarb->r=*ps;
     ss=0;aarb->s=ss;
     dd=0;aarb->d=dd;
     return;
}
int eval(nod *aarb)
{
     if(aarb->r>='?') return val[(int)(aarb->r-'?')];
     if(aarb->r=='+') return eval(aarb->s)||eval(aarb->d);
     if(aarb->r=='*') return eval(aarb->s)&&eval(aarb->d);
     return !eval(aarb->s);
}