Cod sursa(job #579968)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 12 aprilie 2011 17:01:02
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
FILE *f=fopen("bool.in","r");
FILE *g=fopen("bool.out","w");
int n,t;
int val[301];
char e[1001],s[101],*p;

int expresie();
int termen();
int factor();

bool ver(){
	if(t>=2 && e[t]=='R' && e[t-1]=='O'){
		t--;
		e[t]='|';
		return true;
	}
	if(t>=3 && e[t]=='D' && e[t-1]=='N' && e[t-2]=='A'){
		t-=2;
		e[t]='&';
		return true;
	}
	if(t>=3 && e[t]=='T' && e[t-1]=='O' && e[t-2]=='N'){
		t-=2;
		e[t]='!';
		return true;
	}
	if(t>=4 && e[t]=='E' && e[t-1]=='U' && e[t-2]=='R' && e[t-3]=='T'){
		t-=3;
		e[t]='1';
		return true;
	}
	if(t>=5 && e[t]=='E' && e[t-1]=='S' && e[t-2]=='L' && e[t-3]=='A' && e[t-4]=='F'){
		t-=4;
		e[t]='0';
		return true;
	}
	return false;	
}

int factor(){
	int r=0;
	while(*p=='!'){
		p++;
		r=!r;
	}
	if(*p=='('){
		p++;
		r^=expresie();
		p++;
	}
	else{
		r=r^val[*p];
		p++;
	}
	return r;
}

int termen(){
	int r;
	r=factor();
	while(*p=='&'){
		p++;
		int z=factor();
		r&=z;
	}
	return r;
}

int expresie(){
	int r=termen();
	while(*p=='|'){
		if(*p=='|'){
			p++;
			int z=termen();
			r|=z;
			continue;
		}
	}
	return r;
}

int main(void){
	register int i,j;
	
	char ch='q';
	while(ch!='\n'){
		fscanf(f,"%c",&ch);
		if(ch==' ')
			continue;
		e[++t]=ch;
		ver();
	}
	
	val['1']=1,val['0']=0;
	fscanf(f,"%d\n",&n);
	for(i=1;i<=n;i++){
		fscanf(f,"%c",&ch);
		val[ch]=1^val[ch];
		p=e+1;
		fprintf(g,"%d",expresie());
	}
	return 0;
}