Cod sursa(job #312928)

Utilizator irene_mFMI Irina Iancu irene_m Data 7 mai 2009 15:32:55
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#define MaxN 109
#define MaxS 1009
#define MaxC 300

char S[MaxS],sch[MaxN];
int N,var[MaxC];

int termen(int);
int factor(int);

void cit()
{
	ifstream fin("bool.in");
	fin.get(S,MaxS,'\n'); fin.get();
	fin>>N; fin.get();
	fin.get(sch,MaxN,'\n');
	fin.close();
}

int eval(int k)
{
	int r=termen(k);
	char aux[4];
	aux[0]=S[k]; aux[1]=S[k+1]; 
	if(aux[0]=='A' && aux[1]=='N')
	{
		aux[2]=S[k+2]; 
		aux[3]='\0';
	}
	else
		aux[2]='\0';
	while(aux=="AND" || aux=="OR")
	{
		if(aux=="AND")
		{
			k++;
			r=r and termen(k);
		}
		else
			if(aux=="OR")
			{
				k++;
				r=r or termen(k);
			}
	}
	return r;
}

int termen(int k)
{
	int r=factor(k);
	char aux[4];
	aux[0]=S[k]; aux[1]=S[k+1]; aux[2]=S[k+2];
	aux[3]=S[k+3];
	while(aux=="NOT")
		r=!factor(k);
	return r;
}
	
int factor(int k)
{
	int r;
	char aux[6];
	strncpy(aux,S+k,5);
	if(aux[5]!='E')
		aux[5]='\0';
	aux[6]='\0';
	if(S[k]=='(')
	{
		k++;
		r=eval(k);
		k++;
	}
	else
		if(S[k]==' ')
		{
			k++;
			r=eval(k);
		}
		else
		{
			if(aux=="FALSE")
				r=0;
			else
				if(aux=="TRUE")
					r=1;
				else
					r=var[S[k]-'A'];
		}
	return r;
}

int main()
{
	cit();
	ofstream fout("bool.out");
	for(int i=0;i<N;i++)
	{
		if(var[sch[i]-'A']==0)
			var[sch[i]-'A']=1;
		else
			var[sch[i]-'A']=0;
		fout<<eval(0);
	}
	fout.close();
}