Cod sursa(job #113373)

Utilizator coderninuHasna Robert coderninu Data 9 decembrie 2007 19:44:58
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>

int v[100], n, lg=-1, i;
char s[1001], bau, c;

int factor();
int termen();
int val();
int expr();

int main()
{
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	scanf("%c", &c);
	while (c!='\n')
		{ s[++lg]=c; scanf("%c", &c); }
	scanf("%d\n", &n);
	for (int I=1; I<=n; I++)
	{
		scanf("%c", &bau);
		v[bau-'A']=!v[bau-'A'];
		i=0;
		printf("%d", expr());
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int expr()
{
	int f=termen(), aux;
	while (i<lg && s[i]=='O' && s[i+1]=='R')
	{
		i+=3;
		aux=termen();
		f=aux || f;
	}
	return f;
}

int termen()
{
	int f=factor(), aux;
	while (i<lg && s[i]=='A' && s[i+1]=='N')
	{
		i+=4;
		aux=factor();
		f=f && aux;
	}
	return f;
}

int factor()
{
	int f;
	if (s[i]=='(')
	{
		++i;
		f=expr();
		++i;
		if (s[i]==' ') i++;
	}
	else
	{
		f=val();
	}
	return f;
}

int val()
{
	int f;
	if (s[i]=='N' && s[i+1]=='O')
	{
		i+=4;
		if (s[i]=='(')
		{
			i++;
			f=!expr();
			i++;
			if (s[i]==' ') i++;
		}
		else	f=!val();
	}
	else if (s[i]=='T' && s[i+1]=='R')
	{
		i+=4;
		if (s[i]==' ') i++;
		f=1;
	}
	else if (s[i]=='F' && s[i+1]=='A')
	{
		i+=5;
		if (s[i]==' ') i++;
		f=0;
	}
	else
	{
		f=v[s[i]-'A'];
		i++;
		if (s[i]==' ') i++;
	}
	return f;
}