Pagini recente » Cod sursa (job #1334385) | Cod sursa (job #2309742) | Cod sursa (job #2953577) | Cod sursa (job #1105805) | Cod sursa (job #1826351)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *f, *g;
bool expresie();
bool termen();
bool factor();
char s[1001], a[1001];
int ap[50];
int n;
int crChar;
bool isChar(char c)
{
if(c >= 'A' && c <= 'Z')
return 1;
return 0;
}
bool isSign1(char c)
{
if(c == '|')
return 1;
return 0;
}
bool isSign3(char c)
{
if(c == '&')
return 1;
return 0;
}
bool expresie()
{
bool rez = termen(), x;
while(isSign1(s[crChar]) != 0)
crChar ++, x = termen(), rez = (x || rez);
return rez;
}
bool and1(bool a, bool b)
{
if((a == 1) && (b == 1))
return 1;
return 0;
}
bool termen()
{
bool rez = factor(), x;
while(isSign3(s[crChar]))
{
if(s[crChar] == '&')
crChar ++, x = factor(), rez = and1(x, rez);
}
return rez;
}
bool factor()
{
bool rez = 0, sign = 1;
while(s[crChar] == '~')
{
sign = !sign;
crChar ++;
}
if(s[crChar] == '(')
{
crChar ++;
rez = expresie();
crChar ++;
if(sign == 0)
return (!rez);
return rez;
}
if(isChar(s[crChar]))
{
rez = ap[s[crChar] - 'A' + 1];
crChar ++;
}
if(s[crChar] == '1' || s[crChar] == '0')
rez = s[crChar] - '0', crChar ++;
if(sign == 0)
return (!rez);
return rez;
}
int operators(int i)
{
if(s[i] == 'O' && s[i + 1] == 'R')
return 1;
if(s[i] == 'A' && s[i + 1] == 'N')
return 2;
if(s[i] == 'N' && s[i + 1] == 'O')
return 3;
if(s[i] == 'T' && s[i + 1] == 'R')
return 4;
if(s[i] == 'F' && s[i + 1] == 'A')
return 5;
}
int edits(int op)
{
if(op == 1)
return 2;
if(op == 2 || op == 3)
return 3;
if(op == 4)
return 4;
return 5;
}
char sign(int op)
{
if(op == 1)
return '|';
if(op == 2)
return '&';
if(op == 3)
return '~';
if(op == 4)
return '1';
return '0';
}
void editString()
{
int i, op;
int crCharEdit = 0, crChar = 0;
int len = strlen(s);
while(crCharEdit < len)
{
if(isChar(s[crCharEdit]))
{
if(isChar(s[crCharEdit + 1]))
{
op = operators(crCharEdit);
a[crChar] = sign(op);
crChar ++;
crCharEdit += edits(op);
}
else
a[crChar] = s[crCharEdit], crChar ++, crCharEdit ++;
}
else
{
if(s[crCharEdit] != ' ')
a[crChar] = s[crCharEdit], crChar ++, crCharEdit ++;
else
crCharEdit ++;
}
}
a[crChar] = 0;
strcpy(s, a);
}
void solve()
{
f = fopen("bool.in", "r");
g = fopen("bool.out", "w");
fgets(s, 1005, f);
s[strlen(s) - 1] = 0;
editString();
// printf("%s*\n", s);
fscanf(f, "%d\n", &n);
int i;
char chr;
for(i = 1; i <= n; i ++)
{
crChar = 0;
fscanf(f, "%c", &chr);
ap[chr - 'A' + 1] = !ap[chr - 'A' + 1];
fprintf(g, "%d", expresie());
}
fprintf(g, "\n");
fclose(f);
fclose(g);
}
int main()
{
solve();
return 0;
}