Cod sursa(job #349692)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 21 septembrie 2009 12:00:11
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<cstdio>
#define N 1005
const int M=(int)'Z'+1;
char s[N],s1[N],s2[N],*p;
short int nr,n;
bool b[M];
bool eval();
bool termen();
bool factor();
bool valoare();
void citire()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(s,N-1,stdin);
	scanf("%hd\n",&n);
	fgets(s1,N,stdin);
}
void sir()
{
	p=s;
	while (*p&&*p!='\n')
	{
		if (*p=='A')
		{
			++p;
			if (*p=='N')
			{
				s2[nr++]='&';
				++p;
				++p;
			}
			else
				s2[nr++]='A';
			continue;
		}
		if (*p=='O')
		{
			++p;
			if (*p=='R')
			{
				s2[nr++]='|';
				++p;
			}
			else
				s2[nr++]='O';
			continue;
		}
		if (*p=='T')
		{
			++p;
			if (*p=='R')
			{
				s2[nr++]='1';
				++p;
				++p;
				++p;
			}
			else
				s2[nr++]='T';
			continue;
		}
		if (*p=='F')
		{
			++p;
			if (*p=='A')
			{
				s2[nr++]='0';
				++p;
				++p;
				++p;
				++p;
			}
			else
				s2[nr++]='F';
			continue;
		}
		if (*p=='N')
		{
			++p;
			if (*p&&*p=='O')
			{
				s2[nr++]='!';
				++p;
				++p;
			}
			else
				s2[nr++]='N';
			continue;
		}
		if (*p=='(')
		{
			s2[nr++]='(';
			++p;
			continue;
		}
		if (*p==')')
		{
			s2[nr++]=')';
			++p;
			continue;
		}
		if (*p>='A'&&*p<='Z')
			s2[nr++]=*p;
		++p;
	}
	--nr;
}
bool valoare()
{
	bool r=0;
	if (*p=='(')
	{
		++p;
		r=eval();
		++p;
	}
	else
		if(*p=='1'||*p=='0'||(*p>='A'&&*p<='Z'))
		{
		if (*p=='1')
			r=1;
		else
			if(*p=='0')
				r=0;
			else
				if (*p>='A'&&*p<='Z')
					r=b[*p-'A'];
		++p;
		}	
		return r;
}
bool factor()
{
	bool r=0;
	while (*p=='!')
	{
		++p;
		
		r=valoare();
		if (r)
			return 0;
		return 1;
	}
	r=valoare();
		return r;
}
bool termen()
{
	bool r=factor();
	while (*p=='&')
	{
		++p;
		r&=factor();
	}
	return r;
}
bool eval()
{
	bool r=termen();
	while (*p=='|')
	{
		++p;
		r=r|termen();
	}
	return r;
}
void teste()
{
	char *p1;
	p1=s1;
	while(*p1>='A'&&*p1<='Z')
	{
		if (b[*p1-'A'])
			b[*p1-'A']=0;
		else
			b[*p1-'A']=1;
		++p1;
		p=s2;
		//printf("%s",s2);
		printf("%d",eval());
	}
}
int main()
{
	citire();
	sir();
	//printf("%s",s2);
	teste();
	return 0;
}