Cod sursa(job #138378)

Utilizator scvalexAlexandru Scvortov scvalex Data 18 februarie 2008 14:47:48
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char exp[1002];
bool vars[26];
int pos;

void skipWhite() {
	while (exp[pos] == ' ') { 
		++pos;
	}
}

bool getVar() {
//	cout << " " << exp[pos] << "(" << pos << ") ";
	bool a = vars[exp[pos] - 'A'];
	++pos;
	skipWhite();
	return a;
}

bool boolExpression();

bool factor() {
//	cout << "{F(" << pos << ") ";
	bool a;
	if (exp[pos] == '(') {
		++pos;
		skipWhite();
		a = boolExpression();
		++pos;
		skipWhite();
	} else
		a = getVar();
//	cout << "F(" << pos << ")}";
	return a;
}

typedef bool (*ParseFunction)();

bool notFactor() {
	ParseFunction f;
	bool neg = false;

//	cout << "{NF(" << pos << ") ";
	if (strstr(exp + pos, "NOT") == exp + pos) {
		pos += 3;
		skipWhite();
		neg = true;
		f = notFactor;
		//return !notFactor();
	} else {
		f = factor;
		//return factor();
	}

	bool a = f();
//	cout << "NF(" << pos << ")}";

	if (neg)
		return !a;
	return a;
}

bool boolTerm() {
//	cout << "{BT(" << pos << ") ";
	bool a = notFactor();
	while (strstr(exp + pos, "AND") == exp + pos) {
		pos += 3;
		skipWhite();
		bool b = notFactor();
		a = a && b;
	}
//	cout << "BT(" << pos << ")}";
	return a;
}

bool boolExpression() {
//	cout << "{BE(" << pos << ") ";
	bool a = boolTerm();
	while (strstr(exp + pos, "OR") == exp + pos) {
		pos += 2;
		skipWhite();
		bool b = boolTerm();
		a = a || b;
	}
//	cout << "BE(" << pos << ")}";
	return a;
}

int main(int argc, char *argv[]) {
	ifstream fin("bool.in");	
	fin.getline(exp, 1001);
//	cout << exp << endl;
	int N;
	fin >> N;
	char c;
	ofstream fout("bool.out");
	while (N--) {
		fin >> c;
		vars[c - 'A'] = !vars[c - 'A'];
		pos = 0;
		skipWhite();
//		for (int i(0); i < 26; ++i)
//			cout << vars[i];
//		cout << endl;
		//cout << eval();
		fout << boolExpression();
	}
	fout << endl;
	fout.close();
	fin.close();

	return 0;
}