Cod sursa(job #177188)

Utilizator varuvasiTofan Vasile varuvasi Data 12 aprilie 2008 13:51:13
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#include <string.h>

int lg, N, i;
int V[30];
char e[1001];
char chg[1001];

FILE *fin = fopen("bool.in", "rt"), *fout = fopen("bool.out", "wt");
int evalExp();
int evalAnd();
int evalOr();
int eval();
void cSpaces();

int main()
{
	int j;

	fgets(e, 1001, fin);
	lg = strlen(e) - 1;

	fscanf(fin, "%d\n", &N);
	fgets(chg, 1001, fin);
	//fprintf(fout, "%s\n%s", e, chg);

	for (j = 0; j < N; j++)
	{
		i = 0;
		V[chg[j] - 'A'] = !V[chg[j] - 'A'];
		fprintf(fout, "%d", evalExp());
	}
	fclose(fin), fclose(fout);
	return 0;
}

int evalExp()
{
	int f = evalOr();
	cSpaces();
	while (i < lg - 1 && e[i] == 'O' && e[i+1] == 'R')
	{
		i += 2;
		cSpaces();
		f |= evalOr();
	}
	return f;
}

int evalOr()
{
	int f = evalAnd();
	cSpaces();
	while (i < lg - 2 && e[i] == 'A' && e[i+1] == 'N' && e[i+2] == 'D')
	{
		i += 3;		
	    cSpaces();
		f &= evalAnd();
	}
	return f;
}

int evalAnd()
{
	int f;
	while (i < lg - 2 && e[i] == 'N' && e[i+1] == 'O' && e[i+2] == 'T')
	{
		i += 3;
		cSpaces();
		if (e[i] == '(')
		{
			i++;
			f = !evalExp();
			i++;
		}
		else
		{
			f = !eval();
		}
		return f;
	}
	if (e[i] == '(')
	{
		i++;
		cSpaces();
	//	fprintf(fout, "%d %d\n", i, lg);
		f = evalExp();
		i++;
	//	fprintf(fout, "%d %d\n", i, lg);
		cSpaces();
	}
	else
		f = eval();
	return f;
}

int eval()
{
	char c = e[i];
	if (i < lg - 3 && e[i] == 'T' && e[i+1] == 'R' && e[i+2] == 'U' && e[i+3] == 'E')
	{
		i += 4;
		cSpaces();
		return 1;
	}
	if (i < lg - 4 && e[i] == 'F' && e[i+1] == 'A' && e[i+2] == 'L' && e[i+3] == 'S' && e[i+4] == 'E')
	{
		i += 5;
		cSpaces();
		return 0;
	}
	i++;
	cSpaces();
//	fprintf(fout, "%c %d\n", c, V[c - 'A']);
	return V[c - 'A'];
}

void cSpaces()
{
	while (i < lg && e[i] == ' ') i++;
}