Pagini recente » Diferente pentru schimbare-borland/alternativa intre reviziile 13 si 12 | Cod sursa (job #1883745) | Cod sursa (job #875944) | Cod sursa (job #2225076) | Cod sursa (job #2671791)
#include <fstream>
#include <map>
#include <stack>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char sir[1005], x;
int n, nrl;
map<char, bool> valori_litere;
stack<char> semne;
stack<bool> numere;
void evaluare_secventa() {
while (!semne.empty() && semne.top() != '(') {
bool a = numere.top();
numere.pop();
char semn = semne.top();
semne.pop();
bool b;
if (semn != 'N') {
b = numere.top();
numere.pop();
}
switch (semn) {
case 'N':
numere.push(!a);
break;
case 'A':
numere.push(a & b);
break;
case 'O':
numere.push(a | b);
break;
}
}
}
void evaluare() {
for (int i = 0; i < nrl; ++i) {
if (sir[i] == '(')
semne.push('(');
else if (sir[i] == ')') {
evaluare_secventa();
semne.pop();
} else if (sir[i] == 'N' && sir[i + 1] == 'O') {
semne.push('N');
i += 2;
} else if (sir[i] == 'A' && sir[i + 1] == 'N') {
if (!semne.empty() && semne.top() == 'N')
evaluare_secventa();
semne.push('A');
i += 2;
} else if (sir[i] == 'O' && sir[i + 1] == 'R') {
evaluare_secventa();
semne.push('O');
i++;
} else if (sir[i] == 'T' && sir[i + 1] == 'R') {
numere.push(true);
i+=3;
}
else if (sir[i] == 'F' && sir[i + 1] == 'A') {
numere.push(false);
i+=4;
}
else if (isalpha(sir[i]))
numere.push(valori_litere[sir[i]]);
}
evaluare_secventa();
}
int main() {
f.getline(sir, 1005);
nrl = strlen(sir);
f >> n;
for (int i = 0; i < n; ++i) {
f >> x;
valori_litere[x] = !valori_litere[x];
evaluare();
g << numere.top();
numere.pop();
}
return 0;
}