Cod sursa(job #113359)

Utilizator coderninuHasna Robert coderninu Data 9 decembrie 2007 18:43:35
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

int v[35], 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 val()
{
	int f;
	if (s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
	{
		i+=3;
		if (s[i]=='(')
		{
			i++;
			f=!expr();
			i++;
		}
		else f=!val();
		if (s[i]==' ') i++;
		return f;
	}
	else if (s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' ) { i+=4; if (s[i]==' ') i++; return 1; }
	else if (s[i]=='F' && s[i+1]=='A' && s[i+2]=='L') { i+=5; if (s[i]==' ') i++; return 0; }
	else {if (s[i]==' ') i++; return v[s[i]-'A'];}
}

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

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

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