Pagini recente » Cod sursa (job #75900) | Cod sursa (job #1161770) | Cod sursa (job #3320484) | Cod sursa (job #91687) | Cod sursa (job #3312464)
#include <fstream>
using namespace std;
ifstream fin ("bool.in");
ofstream fout("bool.out");
char s[1005], t[1005];
int i, k, n;
int F[130];
char c;
int expresieOr();
int expresieAnd();
int expresieXor();
int factor();
/// functia pentru tratarea separarii prin operatorul
/// de prioritate minima
int expresieOr() {
int r = expresieAnd();
while (t[i] == '|') {
i++;
r = (r | expresieAnd());
}
return r;
}
int expresieAnd() {
int r = expresieXor();
while (t[i] == '&') {
i++;
r = (r & expresieXor());
}
return r;
}
int expresieXor() {
int r = factor();
while (t[i] == '^') {
i++;
r = (r^factor());
}
return r;
}
int factor() {
int r;
/*
Factorii pot fi de trei tupuri:
(expresie)
constanta 0 sau 1
o variabila a carei valoare o extragem din vectorul f
*/
if (t[i] == '(') {
i++;
r = expresieOr();
i++;
} else {
if (t[i] =='0') {
i++;
return 0;
}
if (t[i] == '1') {
i++;
return 1;
}
return F[ t[i++] ];
}
return r;
}
int main () {
fin.get(s, 1002); /// citire sir care poate contine si spatii
fin.get();
/// parsarea lui s pentru si obtinerea sirului simplificat t
for (i=0;s[i]!=0;i++) {
if (s[i] == ' ')
continue;
if (s[i] == '(' || s[i] == ')') {
t[k++] = s[i];
continue;
}
if (s[i] == 'T' && s[i+1] == 'R') {
t[k++] = '1';
i+=3;
continue;
}
if (s[i]== 'F' && s[i+1] == 'A') {
t[k++] = '0';
i+=4;
continue;
}
if (s[i] == 'O' && s[i+1] == 'R') {
t[k++] = '|';
i++;
continue;
}
if (s[i]=='A' && s[i+1] == 'N') {
t[k++] = '&';
i+=2;
continue;
}
if (s[i] == 'N' && s[i+1] == 'O') {
t[k++] = '1';
t[k++] = '^';
i+=2;
continue;
}
t[k++] = s[i];
}
fin>>n;
for (int j=1;j<=n;j++) {
fin>>c;
//F[c] = !F[c];
F[c] = 1 - F[c]; /// se trece din 1 în 0 si din 0 in 1
i = 0;
fout<<expresieOr();
}
return 0;
}