Cod sursa(job #1573562)

Utilizator Firealex2Rotileanu Alexandru Firealex2 Data 19 ianuarie 2016 19:42:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 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[2000];
char aux[2000];
int main()
{
	getline(fi, s);
	int n, i, k = 0;
	n = s.length();
	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';
			i += 3;
		}
		else if (s[i] == 'F' && s[i + 1] == 'A')
		{
			aux[k++] = '0';
			i += 4;
		}
		else if (s[i] != ' ')
			aux[k++] = s[i];
	}
	int numar;
	fi >> numar;
	for (i = 1; i <= numar; i++)
	{
		char b;
		fi >> b;
		p = 0;
		vector[b - 'A'] = !vector[b - 'A'];
		fo << expresie();
	}
	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 rasp = 0;

	if (aux[p] >= 'A' && aux[p] <= 'Z') {
		return vector[aux[p++] - 'A'];
	}
	else if (aux[p] == '0') {
		p++;
		return 0;
	}
	else if (aux[p] == '1') {
		p++;
		return 1;
	}
	else if (aux[p] == '(') {
		p++;
		rasp = expresie();
		p++;
	}
	else if (aux[p] == '!') {
		p++;
		return !factor();
	}
	return rasp;
}