Pagini recente » Cod sursa (job #1530668) | Cod sursa (job #1576007) | Cod sursa (job #2049303) | Cod sursa (job #1013802) | Cod sursa (job #1570711)
#include <stdio.h>
#include <ctype.h>
#define Nadejde 1005
#define SIGMA 26
/** Gramatica expresiei, problema "Bool":
* E = T | T + '|' + T + ... + '|' + T.
* T = F | F + '&' + F + ... + '&' + F.
* F = litera mare | 0 | 1 | '(' + E + ')' | !F.
* Multumim Doamne!
**/
int bit[SIGMA];
int N, buff, pos;
char s[Nadejde + 5];
/** Pune in s caracterul c. **/
void push(int *i, char c, int delta) {
s[buff++] = c;
(*i) += delta;
}
/** Transforma sirul dat intr-o forma mai simpla. **/
void init() {
int i;
for (i = 0; s[i] != '\0'; i++) {
/* AND. */
if (s[i] == 'A') {
if (s[i + 1] == 'N') {
push(&i, '&', 2);
} else {
push(&i, 'A', 0);
}
/* OR. */
} else if (s[i] == 'O') {
if (s[i + 1] == 'R') {
push(&i, '|', 1);
} else {
push(&i, 'O', 0);
}
/* NOT. */
} else if (s[i] == 'N') {
if (s[i + 1] == 'O') {
push(&i, '!', 2);
} else {
push(&i, 'N', 0);
}
/* TRUE. */
} else if (s[i] == 'T') {
if (s[i + 1] == 'R') {
push(&i, '1', 3);
} else {
push(&i, 'T', 0);
}
/* FALSE. */
} else if (s[i] == 'F') {
if (s[i + 1] == 'A') {
push(&i, '0', 4);
} else {
push(&i, 'F', 0);
}
/* Alt caracter care nu e spatiu. */
} else if (s[i] != ' ') {
push(&i, s[i], 0);
}
}
s[buff] = '\0';
}
int E(), T(), F();
/** Evalueaza o expresie. **/
int E() {
int result = T();
while (s[pos] == '|') {
pos++;
result |= T();
}
return result;
}
/** Evalueaza un termen. **/
int T() {
int result = F();
while (s[pos] == '&') {
pos++;
result &= F();
}
return result;
}
/** Evalueaza un factor. **/
int F() {
int result = 0;
if (isupper(s[pos])) {
result = bit[s[pos++] - 'A'];
} else if (s[pos] == '0') {
pos++;
result = 0;
} else if (s[pos] == '1') {
pos++;
result = 1;
} else if (s[pos] == '(') {
pos++;
result = E();
pos++;
} else if (s[pos] == '!') {
pos++;
result = !F();
}
return result;
}
int main(void) {
int c;
FILE *f = fopen("bool.in", "r");
/* Citirea datelor. */
fgets(s, Nadejde, f);
init();
/* Calcularea solutiei si afisarea ei. */
freopen("bool.out", "w", stdout);
for (fscanf(f, "%d\n", &N); N; N--) {
c = fgetc(f) - 'A';
bit[c] = !bit[c];
pos = 0;
fprintf(stdout, "%d", E());
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}