Cod sursa(job #532177)

Utilizator Robert29FMI Tilica Robert Robert29 Data 10 februarie 2011 22:45:18
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 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];
int p;
int m,j,n,i;
int termen();
int factor();
int atom();

int eval(){
	int x=termen();
	while(v1[p]=='|'){
		++p;
		x|=termen();
	}
	return x;
}
int termen(){
	int x=factor();
	while(v1[p]=='&'){
		++p;
		x&=factor();
	}
	return x;
}
int factor(){
	int x=atom();
	while(v1[p]=='^'){
		++p;
		x=1^atom();
	}
	return x;
}
int atom(){
	int x=0;
	if(v1[p]=='('){
		++p;
		x=eval();
		++p;
	}else{
		if(v1[p]=='0')
			x=0;
		else if(v1[p]=='1')
			x=1;
		else
			x=w1[v1[p]-'A'];
		++p;
	}
	return x;
}
int main() {
	fscanf(f,"%c",&v[i]);
	while(v[i]!=10)
		fscanf(f,"%c",&v[++i]);
	
	fscanf(f,"%d\n",&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(('A'<=v[i]&&v[i]<='Z')||v[i]=='('||v[i]==')'){
			v1[++j]=v[i];
			++i;
		}
		else
			i++;
			
	for(i=0;i<n;i++){
		w1[w[i]-'A']=!w1[w[i]-'A'];
		p=1;
		//p++;
		fprintf(g,"%d",eval());
	}
	
	fclose(g);
	fclose(f);
	return 0;
}