Pagini recente » Cod sursa (job #3127999) | Cod sursa (job #2871186) | Cod sursa (job #479198) | Cod sursa (job #1408994) | Cod sursa (job #2533603)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char s[1010], c, v[1010];
int fr[1010], lit, k, i;
int Or(), And(), Xor(), Factor();
int Or() {
int r = And();
while ( v[i] == '|' ){
i++;
r |= And();
}
return r;
}
int And() {
int r = Xor();
while ( v[i] == '&' ){
i++;
r &= Xor();
}
return r;
}
int Xor() {
int r = Factor();
while ( v[i] == '^' ){
i++;
r ^= Factor();
}
return r;
}
int Factor() {
int r;
if ( v[i] == '(' ){
i++;
r = Or();
i++;
} else {
if ( v[i] == '1' ){
i++;
return 1;
}
if ( v[i] == '0' ){
i++;
return 0;
}
return fr[v[i++]];
}
return r;
}
///A&((B|1^C)|((1)))
int main()
{
f.getline(s, 1002);
for ( i=0; s[i]; i++ ){
if ( s[i] == ' ' )
continue;
if ( s[i] == '(' || s[i] == ')' ){
v[k++] = s[i];
continue;
}
if ( s[i] == 'T' && s[i+1] == 'R' ){
v[k++] = '1';
i += 3;
continue;
}
if ( s[i] == 'F' && s[i+1] == 'A' ){
v[k++] = '0';
i += 4;
continue;
}
if ( s[i] == 'O' && s[i+1] == 'R' ){
v[k++] = '|';
i++;
continue;
}
if ( s[i] == 'A' && s[i+1] == 'N' ){
v[k++] = '&';
i += 2;
continue;
}
if ( s[i] == 'N' && s[i+1] == 'O' ){
v[k++] = '1';
v[k++] = '^';
i += 2;
continue;
}
v[k++] = s[i];
}
for ( f>>lit; lit--; ){
f>>c;
fr[c] = 1-fr[c];
i = 0;
g<<Or();
}
return 0;
}