Pagini recente » Cod sursa (job #1737591) | Cod sursa (job #343047) | Cod sursa (job #1863013) | Cod sursa (job #2300769) | Cod sursa (job #3338941)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define NE 1000
#define NO 100
#define NL 26
char s[NE+2], op[NO+1];
bool val_var[NL];
int p;
void transforma();
bool expresie();
bool termen();
bool factor();
int main()
{
FILE *in, *out;
in = fopen("bool.in", "r");
fgets(s, NE + 2, in);
transforma();
int n_op;
fscanf(in, "%d\n", &n_op);
fgets(op, NO + 1, in);
out = fopen("bool.out", "w");
for (int i = 0; i < n_op; i++)
{
int poz_alfa = op[i] - 'A';
val_var[poz_alfa] = (!val_var[poz_alfa]);
p = 0;
fprintf(out, "%d", expresie());
}
fprintf(out, "\n");
fclose(in);
fclose(out);
return 0;
}
void transforma()
{
int i = 0, n = strlen(s);
if (s[n-1] == '\n')
{
s[n-1] = '\0';
}
n = 0;
while (s[i] != '\0')
{
if (s[i] == 'T' && s[i+1] == 'R')
{
s[n++] = '1';
i += 4;
}
else if (s[i] == 'F' && s[i+1] == 'A')
{
s[n++] = '0';
i += 5;
}
else if (s[i] == 'N' && s[i+1] == 'O')
{
s[n++] = '!';
i += 3;
}
else if (s[i] == 'A' && s[i+1] == 'N')
{
s[n++] = '&';
i += 3;
}
else if (s[i] == 'O' && s[i+1] == 'R')
{
s[n++] = '|';
i += 2;
}
else if (s[i] == ' ')
{
i++;
}
else
{
s[n++] = s[i++];
}
}
s[n] = '\0';
}
bool expresie()
{
bool sau = termen();
while (s[p] == '|')
{
p++;
sau = (termen() || sau);
}
return sau;
}
bool termen()
{
bool shi = factor();
while (s[p] == '&')
{
p++;
shi = (factor() && shi);
}
return shi;
}
bool factor()
{
bool val, semn = true;
while (s[p] == '!')
{
semn = (!semn);
p++;
}
if (s[p] == '(')
{
p++;
val = expresie();
p++;
if (!semn)
{
val = (!val);
}
return val;
}
if ('A' <= s[p] && s[p] <= 'Z')
{
int poz_alfa = s[p++] - 'A';
val = val_var[poz_alfa];
if (!semn)
{
val = (!val);
}
return val;
}
if (s[p++] == '0')
{
val = false;
}
else
{
val = true;
}
if (!semn)
{
val = (!val);
}
return val;
}