Cod sursa(job #1369001)
Utilizator | Data | 2 martie 2015 21:04:14 | |
---|---|---|---|
Problema | Bool | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 4.09 kb |
#include<stdio.h>
using namespace std;
const int L = 1005;
char v[L];
int p;
bool litere[26];
bool eAnd();
bool eOr();
bool eNot();
bool factor();
bool eOr()
{
bool term = eAnd();
while (v[p] == '|')
{
p++;
if (eAnd() == 1)
term = 1;
}
return term;
}
bool eAnd()
{
bool term = eNot();
while (v[p] == '&')
{
p++;
if (eNot() == 0)
term = 0;
}
return term;
}
bool eNot()
{
bool term = factor();
while (v[p] == '!')
{
p++;
term = factor();
term = 1 - term;
}
return term;
}
bool factor()
{
bool termen;
if (v[p] == '(')
{
p++;
termen = eOr();
}
if (v[p] == ')')
{
p++;
return termen;
}
char aux;
aux = v[p];
if (v[p] >= 'A' && v[p] <= 'Z')
{
p++;
return litere[aux - 'A'];
}
if (v[p] == '1')
{
p++;
return true;
}
if (v[p] == '0')
{
p++;
return false;
}
}
int main ()
{
FILE *in, *out;
in = fopen ("bool.in", "r");
out = fopen ("bool.out", "w");
char x;
x = fgetc (in);
while (x != '\n')
{
while (x == ' ')
x = fgetc(in);
if (x >= 'A' && x <= 'Z')
{
if (x == 'A')
{
x = fgetc(in);
if (x == 'N')
{
x = fgetc(in);
x = fgetc(in);
v[p++] = '&';
}
else
v[p++] = 'A';
}
else
{
if (x == 'N')
{
x = fgetc(in);
if (x == 'O')
{
x = fgetc(in);
x = fgetc(in);
v[p++] = '!';
}
else
v[p++] = 'N';
}
else
{
if (x == 'O')
{
x = fgetc(in);
if (x == 'R')
{
x = fgetc(in);
v[p++] = '|';
}
else
v[p++] = 'O';
}
else
{
if (x == 'T')
{
x = fgetc(in);
if (x == 'R')
{
fscanf(in, "UE%c", &x);
v[p++] = '1';
}
else
v[p++] = 'T';
}
else
{
if (x == 'F')
{
x = fgetc(in);
if (x == 'A')
{
fscanf(in, "LSE%c", &x);
v[p++] = '0';
}
else
v[p++] = 'F';
}
else
{
v[p++] = x;
x = fgetc(in);
}
}
}
}
}
}
else
{
v[p++] = x;
x = fgetc(in);
}
//fprintf(out, "%c", v[p-1]);
}
int n;
fscanf (in, "%d\n", &n);
int i;
for (i = 1; i <= n; i++)
{
p = 0;
x = fgetc(in);
litere[x - 'A'] = 1 - litere[x - 'A'];
fprintf(out, "%d", eOr());
}
return 0;
}