Cod sursa(job #714677)

Utilizator lukkerLiNoimi Semain lukker Data 15 martie 2012 22:47:55
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

string sec,aux;
char poz[1001];

ofstream f2("bool.out");

bool t(char x) {
	if(x=='1') return true;
	else return false;
}

void rez(char x) {
	for(int i=0;i<=(int)sec.size()-1;i++) {
		if(poz[i]==x) {
			if(sec[i]=='0') {
				sec[i]='1';
			} else {
				sec[i]='0';
			}
		}
	}
	string r;
	r=sec;
	int pi,pf;
	int n=1;
	do {
		pi=0;
		pf=0;
		n=1;
		bool expr=false,expr2=true;
		for(int i=0;i<=(int)r.size()-1;i+=n) {
			if(r[i]==')') {
				pf=i;
				n=-1;
			}
			if(n==-1&&r[i]=='(') {
				pi=i;
				break;
			}
			if(r[i]=='!'&&(r[i+1]=='0'||r[i+1]=='1')) {
				char c;
				if(r[i+1]=='0') c='1';
				else c='0';
				r[i]=c;
				r[i+1]=c;
			}
		}
		expr2=true;
		expr=false;
		for(int i=0;i<=(int)r.size()-1;i++) cout<<r[i];
		cout<<endl;
		if(pf==0) pf=(int)r.size()-1;
		for(int i=pi;i<=pf;i++) {
			if(r[i]=='0') {
				expr2=false;
			} else {
				if(r[i]=='|') {
					if(expr2) expr=true;
					expr2=true;
				}
			}
		}
		if(expr2) expr=true;
		for(int i=pi;i<=pf;i++) {
			if(expr) {
				r[i]='1';
			} else {
				r[i]='0';
			}
		}
		if(r[pi-1]=='!') {
			char c;
			if(r[pi]=='0') c='1';
			else c='0';
			for(int j=pi-1;j<=pf;j++) {
				r[j]=c;
			}
		}
		for(int i=0;i<=(int)r.size()-1;i++) cout<<r[i];
		cout<<endl;
		if(n!=-1) break;
	} while(true);
	f2<<r[0];
}

bool is_letter(char x) {
	if(x>='A'&&x<='Z') return 1;
	else return 0;
}

int main() {
	FILE *f=fopen("bool.in","r");
	char x;
	do {
		fscanf(f,"%c",&x);
		aux.push_back(x);
	} while(x!=10);
	for(int i=0;i<=(int)aux.size()-1;i++) {
		bool fol=false;
		int o=(int)sec.size();
		poz[o]=' ';
		if(is_letter(aux[i])) {
			if(aux.substr(i,3)=="AND") {
				sec.push_back('&');
				i+=2;
				fol=true;
			}
			if(aux.substr(i,2)=="OR") {
				sec.push_back('|');
				i++;
				fol=true;
			}
			if(aux.substr(i,3)=="NOT") {
				i+=2;
				sec.push_back('!');
				fol=true;
			}
			if(aux.substr(i,4)=="TRUE") {
				sec.push_back('1');
				i+=3;
				fol=true;
			}
			if(aux.substr(i,5)=="FALSE") {
				sec.push_back('0');
				i+=4;
				fol=true;
			}
			if(!fol) {
				poz[o]=aux[i];
				sec.push_back('0');
			}
		} else {
			if(aux[i]=='('||aux[i]==')') {
				sec.push_back(aux[i]);
			}
		}
	}
	int k;
	fscanf(f,"%d",&k);
	int g=1;
	while(!feof(f)) {
		fscanf(f,"%c",&x);
		if(g>k) break;
		if(is_letter(x)) {
			rez(x);
			g++;
		}
	}
	f2<<endl;
	return 0;
}