Cod sursa(job #2272212)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 29 octombrie 2018 20:42:58
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
int k,f[150],j,i=0,n;
char s[1005],sir[1005],ch;
int expresie_or(),expresie_and(),expresie_not(),termen();
int expresie_or() {
	int r;
	r=expresie_and();
	while (sir[i]=='|') {
		i++;
		r=(r | expresie_and());
	}
	return r;
}
int expresie_and() {
	int r;
	r=expresie_not();
	while (sir[i]=='&') {
		i++;
		r=(r & expresie_not());
	}
	return r;
}
int expresie_not() {
	int r;
	r=termen();
	while (sir[i]=='!') {
		i++;
		r=(r ^ termen());
	}
	return r;
}
int termen() {
    int r;
    if (sir[i]=='('){
        i++;
        r=expresie_or();
        i++;
    }
    else {
        if (sir[i]=='0'){
            i++;
            return 0;
        }
			else if (sir[i]=='1'){
            i++;
            return 1;
        }
        return f[sir[i++]];
    }
    return r;
}
int main() {
	fin.get(s,1005);
	//transform sirul in unul fara spatii si care contine &,|,!
	for (int i=0;s[i]!=0;i++) {
		if (s[i]==' ')
			continue;
		if (s[i]=='O'&&s[i+1]=='R') {
			sir[k++]='|';
			i+=1;
			continue;
		}
		if (s[i]=='A'&&s[i+1]=='N') {
			sir[k++]='&';
			i+=2;
			continue;
		}
		if (s[i]=='N'&&s[i+1]=='O') {
			sir[k++]='1';
			sir[k++]='!';
			i+=2;
			continue;
		}
		if (s[i]=='T'&&s[i+1]=='R') {
			sir[k++]='1';
			i+=3;
			continue;
		}
		if (s[i]=='F'&&s[i+1]=='A') {
			sir[k++]='0';
			i+=4;
			continue;
		}
		if (s[i]=='('||s[i]==')') {
			sir[k++]=s[i]; continue;
		}
		sir[k++]=s[i]; //daca nu intra in niciun if => caracterul e litera
	}
	fin>>n;
	for (j=1;j<=n;j++) {
		fin>>ch;
		f[ch]=1-f[ch]; i=0;
		fout<<expresie_or();
	}
}