Cod sursa(job #574898)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 7 aprilie 2011 17:50:47
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 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();

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>=4 && e[t]=='E' && e[t-1]=='L' && e[t-2]=='S' && e[t-3]=='A' && e[t-4]=='F'){
			t-=4;
			e[t]='0';
			return true;
		}
	return false;	
}

int termen(){
	int r;
	char sgn='1';
	if(*p=='('){
		p++;
		r=expresie();
		p++;
	}
	else{ 
		if(*p=='!'){
			sgn='!';
			p++;
		}	
		r=val[*p];
		if(sgn=='!')
			r=1^r;
	}
	return r;
}

int expresie(){
	int r=termen();
	while(*p=='&' || *p=='|'){
		if(*p=='&'){
			p++;
			int z=termen();
			r&=z;
			continue;
		}
		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);
		if(!val[ch])
			val[ch]=1;
		else
			val[ch]=0;
		p=e+1;
		fprintf(g,"%d",expresie());
	}
	return 0;
}