Cod sursa(job #532170)

Utilizator Robert29FMI Tilica Robert Robert29 Data 10 februarie 2011 22:28:29
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#include<string.h>
FILE*f=fopen("bool.in","r");
FILE*g=fopen("bool.out","w");
char v[1005],v1[1001],w[101],w1[26];
char *p;
int m,j,n,i;
int termen();
int factor();
int atom();

int eval(){
	int x=termen();
	while(*p=='|'){
		++p;
		x|=termen();
	}
	return x;
}
int termen(){
	int x=factor();
	while(*p=='&'){
		++p;
		x&=factor();
	}
	return x;
}
int factor(){
	int x=atom();
	while(*p=='^'){
		++p;
		x^=atom();
	}
	return x;
}
int atom(){
	int x=0;
	if(*p=='('){
		++p;
		x=eval();
		++p;
	}else{
		if(*p=='0')
			x=0;
		else if(*p=='1')
			x=1;
		else
			x=w1[*p-'A'];
		++p;
	}
	return x;
}
int main() {
	fscanf(f,"%c",&v[i]);
	while(v[i]>'9'||v[i]<'0')
		fscanf(f,"%c",&v[++i]);
	n=v[i]-'0';
	fscanf(f,"\n");
	fscanf(f,"%s",&w);
	m=i-1;
	
	for(i=0;i<m;)
		if(v[i]=='A'&&v[i+1]=='N'&&v[i+2]=='D'){
			v1[++j]='&';
			i+=3;
		}else if(v[i]=='N'&&v[i+1]=='O'&&v[i+2]=='T'){
			v1[++j]='1';
			v1[++j]='^';
			i+=3;
		}else if(v[i]=='O'&&v[i+1]=='R'){
			v1[++j]='|';
			i+=2;
		}else if(v[i]=='T'&&v[i+1]=='R'&&v[i+2]=='U'&&v[i+3]=='E'){
			v1[++j]='1';
			i+=4;
		}else if(v[i]=='F'&&v[i+1]=='A'&&v[i+2]=='L'&&v[i+3]=='S'&&v[i+4]=='E'){
			v1[++j]='0';
			i+=5;
		}else if(v[i]!=32){
			v1[++j]=v[i];
			++i;
		}
		else
			i++;
			
	for(i=0;i<n;i++){
		w1[w[i]-'A']=!w1[w[i]-'A'];
		p=v1;
		p++;
		fprintf(g,"%d",eval());
	}
	
	fclose(g);
	fclose(f);
	return 0;
}