Pagini recente » Cod sursa (job #563718) | Cod sursa (job #2765400) | test193120947281 | Cod sursa (job #986589) | Cod sursa (job #2453502)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char S[1002], ch, op[1002];
int i, n, val[36], num[1002], k1, k2, p[202], j;
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; S[i] != 0; i++){
if(S[i] == '0' || S[i] == '1')
num[++k1] = S[i] - '0';
else if(S[i] == '(')
op[++k2] = '(';
else if(S[i] == ')'){
while(op[k2] != '(')
process();
k2--;
}
else if(S[i] != ' '){
while(p[op[k2]] > p[S[i]])
process();
op[++k2] = S[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];
for(j = 1; S[j] != 0; j++)
if(S[j] == '!'){
if(S[j + 2] >= 'A' && S[j + 2] <= 'Z'){
if(1 - val[S[j + 2] - 'A' + 1] == 0)
S[j] = '0';
else
S[j] = '1';
strcpy(S + j + 1, S + j + 3);
}
}
else if(S[j] >= 'A' && S[j] <= 'Z'){
if(val[S[j] - 'A' + 1] == 0)
S[j] = '0';
else
S[j] = '1';
}
eval(1);
while(k2 != 0)
process();
g << num[k1];
memset(num, 0, sizeof(num));
memset(op, 0, sizeof(0));
}
return 0;
}