Cod sursa(job #398766)

Utilizator funkydvdIancu David Traian funkydvd Data 19 februarie 2010 12:35:17
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f1 ("bool.in");
ofstream f2 ("bool.out");
char cuv[1010],v[1010];
int logic[30],pozt;
int fact();
int term();
int exp()
{
	int rez=fact();
	while (v[pozt]=='|') {pozt++; rez|=fact();}
	return rez;
}
int fact()
{
	int rez=term();
	while (v[pozt]=='&') {pozt++; rez&=term();}
	return rez;
}
int term()
{
	int rez=0;
	if (v[pozt]=='(') {pozt++; rez=exp(); pozt++;}
	if (v[pozt]=='!') {pozt++; rez=!term();}
	else if (v[pozt]=='1') {pozt++; rez=1;}
	else if (v[pozt]=='0') {pozt++; rez=0;}
	else if (v[pozt]>='A'&&v[pozt]<='Z') {rez=logic[v[pozt]-'A']; pozt++;}
	return rez;
}
int main()
{
	int n,nr=0,i,poz=0,j;
	char c;
	while (f1.get(c) && int(c)!=10) cuv[++nr]=c;
	for (i=1; i<=nr; i++)
	{
		j=i+1;
		if (cuv[i]=='N' && cuv[j]=='O') {v[++poz]='!'; i+=2;}
		else if (cuv[i]=='A' && cuv[j]=='N' ) {v[++poz]='&'; i+=2;}
		else if (cuv[i]=='O' && cuv[j]=='R') {v[++poz]='|'; i++;}
		else if (cuv[i]=='F' && cuv[j]=='A') {v[++poz]='0'; i+=4;}
		else if (cuv[i]=='T' && cuv[j]=='R') {v[++poz]='1'; i+=3;}
		else if (cuv[i]==' ') continue;
		else v[++poz]=cuv[i];
	}
	f1>>n;
	for (i=1; i<=n; i++)
	{
		f1>>c;
		logic[c-'A']^=1;
		pozt=1;
		f2<<exp();
	}
	return 0;
}