Pagini recente » Cod sursa (job #770261) | Cod sursa (job #2498547) | Cod sursa (job #158396) | Cod sursa (job #887951) | Cod sursa (job #1840265)
#include <iostream>
#include <fstream>
#include <map>
#include <cassert>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
int const prmax = 3; //number of priority levels of the operators
int const nmax = 1001;
map<string, char> f;
map<char, int> prio;
map<char, bool> value;
char ex[nmax]; //expression to be evaluated
int n; //number of elements in clean expression
void read() {
f["NOT"] = '!';
f["AND"] = '&';
f["OR"] = '|';
f["TRUE"] = '1';
f["FALSE"] = '2';
prio['|'] = 0;
prio['&'] = 1;
prio['!'] = 2;
char line[nmax];
in.getline(line, nmax);
char word[nmax];
int wordp = 0, exp = 0; //pointers in word and expression
int i = 0;
while (line[i] != '\0') {
if (line[i] == ' ' || line[i] == '(' || line[i] == ')') {
//add word from stack first
if (0 < wordp) {
if (1 < wordp) { //special word
word[wordp] = '\0'; //end word
ex[exp] = f[word];
} else { //just a letter
ex[exp] = word[0];
value[word[0]] = false;
}
wordp = 0; //clear stack
exp++;
}
//then add the bracket, or just ignore the white space
if (line[i] == '(' || line[i] == ')') {
ex[exp] = line[i];
exp++;
}
} else {
word[wordp] = line[i];
wordp++;
}
i++;
}
if (0 < wordp) {
if (1 < wordp) { //special word
word[wordp] = '\0'; //end word
ex[exp] = f[word];
} else { //just a letter
ex[exp] = word[0];
value[word[0]] = false;
}
wordp = 0; //clear word
exp++;
}
ex[exp] = '\0'; //end expression
value['1'] = true; //everything else is false in the beginning
n = exp;
}
char currentChar;
int pointer = 0;
void readNextChar() {
currentChar = ex[pointer];
pointer++;
}
bool boolean() {
bool result;
if (currentChar == f["TRUE"]) {
result = true;
} else if (currentChar == f["FALSE"]) {
result = false;
} else {
result = value[currentChar];
}
// cout<<"Boolean: "<<currentChar<<" -> "<<result<<endl;
readNextChar();
return result;
}
bool sau();
//Factor = !Factor, (Sau), bool
bool factor() {
bool result;
// cout<<"Factor: "<<currentChar<<" ";
if (currentChar == '!') {
readNextChar();
result = !factor();
} else if (currentChar == '(') {
readNextChar();
result = sau();
readNextChar();
} else {
result = boolean();
}
// cout<<" -> "<<result<<endl;
return result;
}
bool si();
//asociativitate la dreapta
//Sau = Si || Si || Si || ...
bool sau() {
bool result = si();
if (currentChar == '|') {
readNextChar();
result = result | sau();
}
return result;
}
//Si = Factor && Factor && Factor && ...
bool si() {
bool result = factor();
if (currentChar == '&') {
readNextChar();
result = result & si();
}
return result;
}
//Sau = Si || Si || Si || ...
//Si = Factor && Factor && Factor && ...
//Factor = !Factor, (Sau), bool
int main() {
read();
int nquery;
in >> nquery;
char letter;
for (int i = 0; i < nquery; i++) {
in >> letter;
value[letter] = !value[letter];
pointer = 0;
readNextChar();
// cout<<endl<<"i = "<<i<<endl;
out << (int) sau();
}
out << endl;
return 0;
}