Pagini recente » Cod sursa (job #1847306) | Cod sursa (job #1958164) | Cod sursa (job #218100) | Cod sursa (job #890797) | Cod sursa (job #2270826)
#include <fstream>
#include <cstring>
#define DIM 1005
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s[DIM], c[DIM], car;
int i, n, m, val[DIM/10];
int expresie1(), expresie2(), expresie3(), factor();
int main(){
fin.get(s, DIM);
for (i=0; i<strlen(s); i++){
if (s[i] == ' '){
continue;
}
if (s[i] == '(' || s[i] == ')'){
c[n++] = s[i];
continue;
}
if (s[i] == 'N' && s[i+1] == 'O' && s[i+2] == 'T'){ //este NOT
c[n++] = '1';
c[n++] = '^';
i+=2;
continue;
}
if (s[i] == 'A' && s[i+1] == 'N' && s[i+2] == 'D'){ //este AND
c[n++] = '&';
i+=2;
continue;
}
if (s[i] == 'O' && s[i+1] == 'R'){ //este OR
c[n++] = '|';
i++;
continue;
}
if (s[i] == 'T' && s[i+1] == 'R'){ //este TRUE
c[n++] = '1';
i+=3;
continue;
}
if (s[i] == 'F' && s[i+1] == 'A'){ //este FALSE
c[n++] = '0';
i+=4;
continue;
}
c[n++] = s[i]; //pun variabila
}
fin >> m;
for (int cnt=1; cnt<=m; cnt++){
fin >> car;
i = 0;
val[car] = 1 - val[car];
fout << expresie1();
}
return 0;
}
int expresie1 (){ //OR
int r;
r = expresie2();
while (c[i] == '|'){
i++;
r = (r | expresie2());
}
return r;
}
int expresie2 (){ //AND
int r;
r = expresie3();
while (c[i] == '&'){
i++;
r = (r & expresie3());
}
return r;
}
int expresie3 (){ //NOT
int r;
r = factor();
while (c[i] == '^'){
i++;
r = (r ^ factor());
}
return r;
}
int factor (){
int r;
if (c[i] == '('){
i++;
r = expresie1();
i++;
}
else{
if (c[i] == '0'){
i++;
return 0;
}
else if (c[i] == '1'){
i++;
return 1;
}
return val[c[i++]];
}
return r;
}