Cod sursa(job #1309884)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 6 ianuarie 2015 10:04:38
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<fstream>
#include<string>
using namespace std;
int n, i, m, j;
string c;
int v[100];
char s[1005], lt;
ifstream fin("bool.in");
ofstream fout("bool.out");
int expresie();
int termen1();
int termen2();
int factor();
int expresie(){
	int r = termen1();
	while(s[i] == '|'){
		i++;
		r = r | termen1();
	}
	return r;
}
int termen1(){
	int r = termen2();
	while(s[i] == '&'){
		i++;
		r = r & termen2();
	}
	return r;
}
int termen2(){
	int r;
	if(s[i] == '!'){
		i++;
		r = factor();
		if(r == 0){
			r = 1;
		}
		else{
			r = 0;
		}
	}
	else{
		r = factor();
	}
	return r;
}
int factor(){
	int r;
	if(s[i] == '('){
		i++;
		r = expresie();
		i++;
	}
	else{
		if(s[i] == '0' || s[i] == '1'){
			r = s[i] - '0';
		}
		else{
			r = v[s[i]];
		}
	}
	return r;
}
int main(){
	getline(fin, c);
	m = c.length();
	i = 0;
	for(j = 0; j < m; j++){
		if(c[j] >= 'A' && c[j] <= 'Z' && (j == m - 1 || c[j+1] == ' ' || c[j+1] == ')')){
			s[++i] = c[j];
		}
		else{
			if(c[j] == '(' || c[j] == ')'){
				s[++i] = c[j];
			}
			else{
				if(c[j] == 'F'){
					s[++i] = '0';
				}
				else{
					if(c[j] == 'T'){
						s[++i] = '1';
					}
					else{
						if(c[j] == 'N'){
							if(s[i] != '!'){
								s[++i] = '!';
							}
							else{
								i--;
							}
						}
						else{
							if(c[j] == 'A'){
								s[++i] = '&';
							}
							else{
								s[++i] = '|';
							}
						}
					}
				}
			}
		}
	}
	fin>> n;
	for(j = 1; j <= n; j++){
		fin>> lt;
		if(v[lt] == 0){
			v[lt] = 1;
		}
		else{
			v[lt] = 0;
		}
		i = 1;
		fout<< expresie();
	}
	return 0;
}