Cod sursa(job #594929)

Utilizator RazvanSSavu Razvan RazvanS Data 10 iunie 2011 16:08:01
Problema Bool Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <stdio.h>
#include <string.h>

#define file_input "bool.in"
#define file_output "bool.out"

#define MAX_LINE_LENGTH 1002
#define VAR_LEN 'Z'-'A'+1

int N, V[VAR_LEN];
char *p;

enum teokens {OR=2,AND=3,NOT=4,OPEN_B=5,CLOSED_B=6,TRUE=7,FALSE=8};

int eval_expr();

int get_next_token () { 

	while ( *p == ' ' ) p++;

	if (*p == 0) return -1;
	//printf("[%c]\n", *p);
	if(*p>='A' && *p<='Z' && ( *(p+1) < 'A' || *(p+1) > 'Z' ) ) {
		p++;
		//printf("value:%c - %d\n", *(p-1) , V[*(p-1) - 'A']);
		return V[*(p-1) - 'A'];
	}

	switch(*p) {

		case 'O' :
			p+=strlen("OR"); 
			return OR;
		case 'A' : 
			p+=strlen("AND");			
			return AND;
		case 'N' : 
			p+=strlen("NOT");			
			return NOT;
		case '(' : 
			p+=strlen("(");			
			return OPEN_B;
		case ')' : 
			p+=strlen(")");		
			return CLOSED_B;
		case 'T' :
			p+=strlen("TRUE");
			return TRUE;
		case 'F' :
			p+=strlen("FALSE");
			return FALSE;
	}

	return -1;
}

int eval_fact () {

	//printf("%s\n", p);
	int token = get_next_token();
	//printf("eval_fact tok:%d\n", token);
	if (token == OPEN_B)  return eval_expr();
	if (token == NOT) return ~eval_fact();
	if (token == TRUE) return 1;
	if (token == FALSE) return 0;
	if (token <= 1) return token;

	return -1;
}	
	

int eval_term (int *token) {

	int res = 1;
	while (1) {
		res &= eval_fact();
		//printf("%d\n", res);
		*token = get_next_token();
		if (*token != AND) break;
	}
	//printf("%d\n", res);
	return res;
}
		

int eval_expr () {
	
	//printf("ONE\n");
	int res = 0;
	int token;
	while (1) {
		res |= eval_term(&token);
		// printf("GIGI:%d\n", token);
		if (token != OR) break;	
	}

	return res;
}
	

int main ( void ) {

	FILE* fin = fopen(file_input,"r");
	FILE* fout = fopen(file_output,"w");

	char expr[MAX_LINE_LENGTH], vars[MAX_LINE_LENGTH];
	fgets(expr,MAX_LINE_LENGTH-1,fin);
	expr[strlen(expr)-1] = 0;
	fscanf(fin,"%d", &N);
	
	int i;
	char c;
	//printf("[%s]\n", vars);
	for(i=0;i<N;++i) {
		
		while ( c = fgetc(fin) ) 
			if ( 'A' <=c && c<='Z') break;
		int idx = c - 'A';
		V[idx] = ~V[idx];
		p = expr;
		fprintf(fout,"%d",eval_expr ());
	}
	
	fprintf(fout,"\n");
	fclose(fin);
	fclose(fout);
	
	return 0;
}