Pagini recente » Cod sursa (job #420530) | Cod sursa (job #1543567) | Cod sursa (job #930284) | Cod sursa (job #1601312) | Cod sursa (job #2527181)
#include <fstream>
#include <cstring>
#define N 1001
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[N], character;
bool values[27];
int n;
int eval(char*& expr);
int operand(char*& expr);
int value(char*& expr);
int NOT(char*& expr);
int OR(char*& expr);
int AND(char*& expr);
int eval(char*& expr){
return OR(expr);
}
void prel(char*& pre){
while(pre[0]){
if(pre[0]==' '){
strcpy(pre, pre+1);
}else if(pre[0] == 'T' && pre[1] == 'R'){
strcpy(pre, pre+3);
pre[0] = '1';
pre++;
}else if(pre[0] == 'F' && pre[1] == 'A'){
strcpy(pre, pre+4);
pre[0] = '0';
pre++;
}else if(pre[0] == 'O' && pre[1] == 'R'){
strcpy(pre, pre+1);
pre[0] = '|';
pre++;
}else if(pre[0] == 'A' && pre[1] == 'N'){
strcpy(pre, pre+2);
pre[0] = '&';
pre++;
}else if(pre[0] == 'N' && pre[1] == 'O'){
strcpy(pre, pre+2);
pre[0] = '!';
pre++;
}else{
pre++;
}
}
}
int AND(char*& expr){
int result = NOT(expr);
while(expr[0] == '&'){
result &= NOT(++expr);
}
return result;
}
int NOT(char*& expr){
int result = 0;
if(expr[0] == '!'){
result = !NOT(++expr);
}else{
result = operand(expr);
}
return result;
}
int OR(char*& expr){
int result =AND(expr);
while(expr[0] == '|'){
result |= AND(++expr);
}
return result;
}
int value(char*& expr){
char c = expr[0];
expr++;
if(isdigit(c)){
return c - '0';
}else{
return values[c-'A'];
}
}
int operand(char*& expr){
int result;
if(expr[0]=='('){
result = eval(++expr);
expr++;
}else{
result = value(expr);
}
return result;
}
int main(){
fin.get(s, N - 1);
char *pre = s;
prel(pre);
fin>>n;
while(n){
fin>>character;
char* expr = s;
values[character - 'A'] = !values[character - 'A'];
fout<<eval(expr);
n--;
}
return 0;
}