Cod sursa(job #320571)

Utilizator ooctavTuchila Octavian ooctav Data 5 iunie 2009 00:45:44
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
// bool.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
# include <string.h>
#define AND e[p]=='A' && e[p+1]=='N' && e[p+2]=='D'
# define OR e[p]=='O'                       && e[p+1]=='R'
#define TRUE e[p]=='T' && e[p+1]=='R' && e[p+2]=='U' && e[p+3]=='E'
#define FALSE e[p]=='F' && e[p+1]=='A' && e[p+2]=='L' && e[p+3]=='S' && e[p+4]=='E'
#define NOT e[p]=='N' && e[p+1]=='O' && e[p+2]=='T'


int va[200];
char e[1001],buna[1001];
int p=0;
int n,ra,c,st,cur=0;
int termen();
int evaluare2();

int evaluare()
{
	int a=evaluare2(),d;
	while(e[p]=='|')
	{
		p++;
		d=evaluare2();
		if(d || a)
			a=true;
		else 
			a=false;
	}

	return a;
}

int evaluare2()
{
	int a=termen(),d;
	while(e[p]=='&')
	{
		p++;
		d=termen();
		if(d && a)
			a=true;
		else
			a=false;
	}
	return a;
}

int termen()
{
	int a,ne=0;
	if(e[p]=='1')
	{
		p++;
		a=1;
		return a;
	}
	if(e[p]=='0')
	{
		p++;
		a=0;
		return a;
	}
	while(e[p]=='!')
	{
		ne=!ne;
		p++;
	}
	if(e[p]>=65 && e[p]<=90)
	{
		if(ne==0)
			a=va[e[p]];
		else
			a=!va[e[p]];
		p++;
	}
	else if(e[p]=='(')
	{
		p++;
		a=evaluare();
		p++;
	}

	return a;

}

void transformare()
{
	int p=0;
	while(e[p] && e[p]!='\n')
		if(AND)
		{
			buna[cur++]='&';
			p=p+3;
		}
		else if(OR)
		{
			buna[cur++]='|';
			p=p+2;
		}
		else if(TRUE)
		{
			buna[cur++]='1';
			p=p+4;
		}
		else if(FALSE)
		{
			buna[cur++]='0';
			p=p+5;
		}
		else if(NOT)
		{
			buna[cur++]='!';
			p=p+3;
		}
		else if(e[p]==' ')
			p++;
		else
			buna[cur++]=e[p++];
	memset(e,1000,0);
	strcpy(e,buna);
}
int main()
{
	freopen("bool.in","r",stdin);
	freopen("bool.out","w",stdout);
	fgets(e,1000,stdin);
	scanf("%d\n",&n);
	transformare();
	p=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%c",&c);
		va[c]=!va[c];
		ra=evaluare();
		printf("%d",ra);
		p=0;
	}


	return 0;
}