Cod sursa(job #281934)

Utilizator space.foldingAdrian Soucup space.folding Data 16 martie 2009 13:47:31
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <string.h>
#include <iostream.h>
char e[1001];
enum bool {false, true};
bool alf[26]={false};
int L, N, i;


bool EvaluareExpresie();
bool EvaluareOr();
bool EvaluareAnd();

bool extra(int k, char string[])
{
	char temp[100];
	int t=0, l=strlen(string);
	while(k<L && e[k]!=' ' &&t<l)
		temp[t++]=e[k++];
	temp[t]=0;

	if(!strcmp(temp, string))
	  return true;
	else
	  return false;
}

bool EvaluareExpresie()
{
	bool rez;
	rez=EvaluareOr();
	while(i<L && extra(i, "OR"))
	{
		i+=3;
		rez = rez || EvaluareOr();
	}
	return rez;
}

bool EvaluareOr()
{
	bool rez;
	rez=EvaluareAnd();
	while(i<L && extra(i, "AND"))
	{
		i+=4;
		rez = rez && EvaluareAnd();
	}
	return rez;
}

bool EvaluareAnd()
{
	bool rez;
	if(e[i]=='(')
	{
		i++;
		rez=EvaluareExpresie();
		i++;
	}
	else
		if(extra(i, "NOT"))
		{
			i+=4;
			rez=!EvaluareExpresie();
		}
		else
			if(e[i]>='A'&&e[i]<='Z' && (e[i+1]==' ' || e[i+1]==')' || i+1==L))
			{
				rez=alf[e[i]-'A'];
				i+=2;
			}
			else
				if(extra(i, "FALSE"))
				{
					i+=6;
					return false;
				}
				else if(extra(i, "TRUE"))
				{
					i+=5;
					return true;
				}
	return rez;
}



int main ()
{
	char c;
	freopen("bool.in", "r", stdin);
	freopen("bool.out", "w", stdout);
	cin.getline(e, 1001);
	cin>>N;
	
	L=strlen(e);
	for(int j=0; j<N; j++)
	{
		cin>>c;
		alf[c-'A']=!alf[c-'A'];
		i=0;
		printf("%d", EvaluareExpresie());
	}
	return 0;
}