Pagini recente » Cod sursa (job #2438087) | Cod sursa (job #240735) | Cod sursa (job #975021) | Cod sursa (job #218005) | Cod sursa (job #2453504)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char S[1002], ch, op[1002], S2[1002];
int i, n, val[36], num[1002], k1, k2, p[202], j, m;
void process(){
if(k2 == 0)
return;
if(op[k2] == '&'){
num[k1 - 1] = num[k1 - 1] & num[k1];
k1--;
}
else if(op[k2] == '!')
num[k1] = ! num[k1];
else if(op[k2] == '|'){
num[k1 - 1] = num[k1 - 1] | num[k1];
k1--;
}
k2--;
}
void eval(int pos){
for(int i = pos; S2[i] != 0; i++){
if(S2[i] == '0' || S2[i] == '1')
num[++k1] = S2[i] - '0';
else if(S2[i] == '(')
op[++k2] = '(';
else if(S2[i] == ')'){
while(op[k2] != '(')
process();
k2--;
}
else if(S2[i] != ' '){
while(p[op[k2]] > p[S2[i]])
process();
op[++k2] = S2[i];
}
}
}
int main()
{ f.getline(S + 1, 1002);
for(i = 1; S[i] != 0; i++){
if(S[i] == 'A' && S[i + 1] == 'N' && S[i + 2] == 'D'){
S[i] = '&';
strcpy(S + i + 1, S + i + 3);
}
else if(S[i] == 'O' && S[i + 1] == 'R'){
S[i] = '|';
strcpy(S + i + 1, S + i + 2);
}
else if(S[i] == 'N' && S[i + 1] == 'O' && S[i + 2] == 'T'){
S[i] = '!';
strcpy(S + i + 1, S + i + 3);
}
else if(S[i] == 'T' && S[i + 1] == 'R' && S[i + 2] == 'U' && S[i + 3] == 'E'){
S[i] = '1';
strcpy(S + i + 1, S + i + 4);
}
else if(S[i] == 'F' && S[i + 1] == 'A' && S[i + 2] == 'L' && S[i + 3] == 'S' && S[i + 4] == 'E'){
S[i] = '0';
strcpy(S + i + 1, S + i + 3);
}
}
f >> n;
p['&'] = 2;
p['|'] = 1;
for(i = 1; i <= n; i++){
f >> ch;
val[ch - 'A' + 1] = 1 - val[ch - 'A' + 1];
m = 0;
for(j = 1; S[j] != 0; j++){
if(S[j] >= 'A' && S[j] <= 'Z')
if(val[S[j] - 'A' + 1] == 0)
S2[++m] = '0';
else
S2[++m] = '1';
else if(S[j] == '!' && (S[j + 2] >= 'A' && S[j + 2] <= 'Z')){
if(1 - val[S[j] - 'A' + 1] == 0)
S2[++m] = '0';
else
S2[++m] = '1';
j = j + 2;
}
else
S2[++m] = S[j];
}
eval(1);
while(k2 != 0)
process();
g << num[k1];
memset(num, 0, sizeof(num));
memset(op, 0, sizeof(0));
}
return 0;
}