Cod sursa(job #532019)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 10 februarie 2011 18:15:31
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
#include<string>
FILE*f=fopen("bool.in","r");
FILE*g=fopen("bool.out","w");

int n,i,Val[200],j,ch,nt;
char A[1050],S[1005],k,Ch[105];

int And();
int fct();

int Or() {
	int R = And();
	while (  S[i] == '|' ){
		++i;
		R |= And();
		
	}
	return R;
}

int And () {
	int R = fct();
	
	while ( S[i] == '&' ){
		++i;
		R &= fct();
	}
	return R;
}

int fct () {
	int R = 1;
	if ( S[i] == '!' ){
		++i;
		R = fct() ^ 1;
	}
	else{
		if ( S[i] == '(' ){
				++i;
				R = Or();
				++i;
		}
		else{
				R = Val[S[i]];
				++i;
		}
	}
	
	return R;
}

int main () {
	fgets(A+1,1020,f);
	n = strlen(A+1);
	
	for ( i = 1 ; i <= n ; ){
		if ( A[i] == '\n')	break;
		if ( A[i] == ' ' ){ ++i;	continue; }
		
		if ( A[i] == 'A' && A[i+1] == 'N' && A[i+2] == 'D' ){
			S[++k] = '&';
			i += 3;
			continue;
		}
		if ( A[i] == 'O' && A[i+1] == 'R' ){
			S[++k] = '|';
			i += 2;
			continue;
		}
		if ( A[i] == 'N' && A[i+1] == 'O' && A[i+2] == 'T' ){
			S[++k] = '!';
			i += 3;
			continue;
		}
		if ( A[i] == 'F' && A[i+1] == 'A' && A[i+2] == 'L' && A[i+3] =='S' && A[i+4] == 'E' ){
			S[++k] = 'Z' + 1;
			i += 5;
			continue;
		}
		if ( A[i] == 'T' && A[i+1] == 'R' && A[i+2] == 'U' && A[i+3] =='E' ){
			S[++k] = 'Z' + 2;
			i += 4;
			continue;
		}
		if ( (A[i] >= 'A' && A[i] <= 'Z') || A[i] == '(' || A[i] == ')' ){
			S[++k] = A[i];
			++i;
		}
	}
	Val['Z'+2] = 1;
	
	fscanf(f,"%d\n",&ch);
	fscanf(f,"%s",Ch+1);
	for ( j = 1 ; j <= ch ; ++j ){
		i = 1;
		Val[Ch[j]] = 1 - Val[Ch[j]];
		fprintf( g,"%d",Or() );
	}
	
	
	fclose(f);
	fclose(g);
	
	return 0;
}