Cod sursa(job #1496712)

Utilizator stoianmihailStoian Mihail stoianmihail Data 5 octombrie 2015 14:38:09
Problema Bool Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>

#define Nadejde 1005
#define SIGMA 26
#define FALSE 6
#define TRUE 5
#define NOT 4
#define AND 4
#define OR 3
#define S 2

/**  Algoritm problema "Bool", autor Adrian Vladu:
 *  Gramtica expresiei este urmatoarea:
 ************************************************
 *  E = T | T or T | T or T or T | ...
 *  T = F | F and F | F and F and F | ...
 *  F = TRUE | FALSE | Majuscula | !F | (E)
 ************************************************
 *  Multumim Doamne!
**/

int N;
char *p;          // copia sirului.
char s[Nadejde];  // sirul nostru.
int alpha[SIGMA]; // valorile majusculelor.

int E(); // antet expresie.
int T(); // antet termen.
int F(); // antet factor.

/** Evalueaza expresia. **/
int E() {
  int result = T();
  while ((p[0] == 'O') && (p[1] == 'R')) {
    p += OR;
    result |= T();
  }
  return result;
}

/** Evalueaza urmatorul termen. **/
int T() {
  int result = F();
  while ((p[0] == 'A') && (p[1] == 'N')) {
    p += AND;
    result &= F();
  }
  return result;
}

/** Evalueaza urmatorul factor. **/
int F() {
  int result = 0;
  if ((p[0] == 'N') && (p[1] == 'O')) {
    p += NOT;
    return !F();
  } else if (p[0] == '(') {
    p++;
    result = E();
    p++;
  } else if ((p[0] == 'T') && (p[1] == 'R')) {
    p += TRUE;
    result = 1;
  } else if ((p[0] == 'F') && (p[1] == 'A')) {
    p += FALSE;
  } else {
    result = alpha[p[0] - 'A'];
    p += S;
  }
  return result;
}

int main(void) {
  FILE *in = fopen("bool.in", "r");
  FILE *out = fopen("bool.out", "w");

  /* Citeste sirul. */
  fgets(s, Nadejde, in);

  /* Raspunde la intrebari. */
  fscanf(in, "%d\n", &N);
  while (N--) {
    char c = fgetc(in);
    alpha[c - 'A'] = !alpha[c - 'A'];

    p = s;
    fprintf(out, "%d", E());
  }
  fclose(in);
  fclose(out);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}