Cod sursa(job #1573521)

Utilizator Firealex2Rotileanu Alexandru Firealex2 Data 19 ianuarie 2016 19:21:45
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb

#include <fstream>
#include <string>

using namespace std;

ifstream fi("bool.in");
ofstream fo("bool.out");

bool expresie();
bool termen();
bool factor();
bool bucata();

string s;
int p;
bool vector[200];
char aux[2000];
int main()
{
	getline(fi, s);
	int n, i, k = 0;
	n = s.length();
	for (i = 1; i <= 26; i++)
		vector[i] = 1;
	for (i = 0; i < n; i++)
	{
		if (s[i] == 'A' && s[i + 1] == 'N')
		{
			aux[k++] = '&';
			i += 2;
		}
		else if (s[i] == 'O' && s[i + 1] == 'R')
		{
			aux[k++] = '|';
			i++;
		}
		else if (s[i] == 'N' && s[i + 1] == 'O')
		{
			aux[k++] = '!';
			i += 2;
		}
		else if (s[i] == 'T' && s[i + 1] == 'R')
			aux[k++] = '1';
		else if (s[i] == 'F' && s[i + 1] == 'A')
			aux[k++] = '0';
		else if (s[i] != ' ')
			aux[k++] = s[i];
	}
	int numar;
	fi >> numar;
	for (i = 1; i <= numar; i++)
	{
		char b;
		fi >> b;
		vector[b - 'A'] = !vector[b - 'A'];
		if (expresie())
			fo << "1";
		else fo << "0";
		p = 0;
	}

	return 0;
}
bool expresie()
{
	bool r2, r = termen();
	while (aux[p] == '|')
	{
		p++;
		r2 = termen();
		r = (r || r2);
	}
	return r;
}
bool termen()
{
	bool r2, r = factor();
	while (aux[p] == '&')
	{
		p++;
		r2 = factor();
		r = (r&&r2);
	}
	return r;
}
bool factor()
{
	bool r;
	while (aux[p] == '!')
	{
		p++;
		r = factor();
		return !r;
	}
	if (aux[p] == '(')
	{
		p++;
		r = expresie();
	}
	else if (aux[p] == '1'){ p++; return true; }
	else if (aux[p] == '0'){ p++; return false; }
	else r = vector[aux[p] - 'A'];
	return r;
}