Cod sursa(job #527525)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 31 ianuarie 2011 20:12:37
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
using namespace std;
#define maxe 1024
#define maxn 128

FILE *fin =fopen("bool.in","r");
FILE *fout=fopen("bool.out","w");

int i,j,N,p;
char s[maxe],var[maxn];
bool v[maxn];

void citire()
{
	fgets(s,sizeof(s),fin);
	fscanf(fin,"%d",&N);
	fscanf(fin,"%s",&var);
	for(i=N;i;i--) var[i]=var[i-1];
}

void variabile()
{
	for(i=1;i<=N;i++)
		v[i]=false;
}

bool pr1_or();
bool pr2_and();
bool pr3_not();
bool paranteze();

bool pr1_or()
{
	bool r=pr2_and(),r2;
	while(s[p]=='O' && s[p+1]=='R')
	{
		p=p+2;
		for(;s[p]==' ';p++);
		r2=pr2_and();
		r=r || r2;
	}
	return r;
}

bool pr2_and()
{
	bool r=pr3_not(), r2;
	while(s[p]=='A' && s[p+1]=='N')
	{
		p=p+3;
		for(;s[p]==' ';p++);
		r2=pr3_not();
		r=r && r2;
	}
	return r;
}

bool pr3_not()
{
	bool r;
	if(s[p]=='N' && s[p+1]=='O')
		while(s[p]=='N' && s[p+1]=='O')
		{
			p=p+3;
			for(;s[p]==' ';p++);
			r=not paranteze();
		}
	else r=paranteze();
	return r;
}

bool paranteze()
{
	bool r;
	if(s[p]=='(')
	{
		p++;
		r=pr1_or();
		p++;
		for(;s[p]==' ';p++);
	}
	if(s[p]>='A' && s[p]<='Z' && (s[p+1]<'A' || s[p+1]>'Z'))
	{
		r=v[s[p]-'A'+1];
		p++;
	}
	if(s[p]=='T' && s[p+1]=='R')
	{
		p=p+4;
		for(;s[p]==' ';p++);
		r=true;
	}
	if(s[p]=='F' && s[p+1]=='A')
	{
		p=p+5;
		for(;s[p]==' ';p++);
		r=false;
	}
	for(;s[p]==' ';p++);
	return r;
}

void rez()
{
	bool expr;
	for(i=1;i<=N;i++)
	{
		v[var[i]-'A'+1]=!v[var[i]-'A'+1];
		p=0;
		expr=pr1_or();
		if(expr==true) fprintf(fout,"1");
		else fprintf(fout,"0");
	}
}

int main()
{
	citire();
	variabile();
	rez();
}