Cod sursa(job #1571818)

Utilizator Firealex2Rotileanu Alexandru Firealex2 Data 18 ianuarie 2016 15:41:42
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

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

int expresie();
int termen();
int factor();
int bucata();

string s;
int p, vector[200];//tot vectorul o sa fie 0 initial ._.
string aux;
int main()
{
	getline(fi, s);
	aux.assign(1000, ' ');
	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;
		if (vector[b - 'A'] == 0)
			vector[b - 'A'] = 1;
		else vector[b - 'A'] = 0;
		fo << expresie();
		p = 0;
	}

	return 0;
}

int expresie()
{
	int s = termen();
	int d;
	while (aux[p] == '|')
	{
		p++;
		if (s == 1)
			s = 1;
		else {
			d = termen();
			if (d == 1)
				s = 1;
			else s = 0;
		}
	}
	return s;
}
int termen()
{
	int q = factor();
	int d;
	while (aux[p] == '&')
	{
		p++;
		if (q == 1)
		{
			d = factor();
			if (d == 1)
				q = 1;
			else q = 0;
		}
		else q = 0;
	}
	return q;
}
int factor()
{
	int q = bucata();
	int d;
	while (aux[p] == '!')
	{
		if (q == 1)
			q = 0;
		else q = 1;
	}
	return q;
}
int bucata()
{
	char q;
	int val;
	if (aux[p] == '('){
		p++;
		val = expresie();
		p++;
		return val;
	}
	val = vector[aux[p] - 'A'];
	return val;
}