Cod sursa(job #1294532)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 17 decembrie 2014 19:25:29
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <string.h>
#define NMAX 1023
FILE *fin, *fout;
char s[NMAX], *p, ch;
bool o[30], eval(), termen(), factor();
int n;
int main()
{
	fin = fopen("bool.in", "r");
	fout = fopen("bool.out", "w");
	fgets(s, NMAX, fin);
	fscanf(fin, "%d", &n);
	fscanf(fin, "%c", &ch);
	//fprintf(fout, "n = %d\n", n);
	for(int i = 0; i < n; i++)
	{
		fscanf(fin, "%c", &ch);
		//fprintf(fout, "check %d\n", i);
		//fprintf(fout, "%c\n", ch);
		o[ch - 'A'] = !o[ch - 'A'];
		p = s;
		fprintf(fout, "%d", eval());
	}
	fclose(fin);
	fclose(fout);
	return 0;
}
bool eval()
{
	bool r = termen();
	while(*p == 'O' && *(p+1) == 'R')
	{
		p+=3;
		r = r|termen();
	}
	return r;
}
bool termen()
{
	bool r = factor();
	while(*p == 'A' && *(p+1) == 'N')
	{
		p+=4;
		r = r&factor();
	}
	return r;
}
bool factor()
{
	bool r = 0;
	if(*p == '(')
	{
		p++;
		r = eval();
		p++;
	}
	else if(*p == 'T' && *(p+1) == 'R')
	{
		p+=5;
		r = 1;
	}
	else if(*p == 'F' && *(p+1) == 'A')
	{
		p+=6;
		r = 0;
	}
	else if(*p == 'N' && *(p+1) == 'O')
	{
		p+= 4;
		r = !factor();
	}
	else
	{
		r = o[*p - 'A'];
		p+=2;
	}
	return r;
}