/* File: inslett.c */
/* Time-stamp: "2001-05-23 21:38:40 calvanes" */
/* Scopo: realizzazione del tipo di dato astratto
          "insieme di lettere alfabetiche maiuscole"
          tramite vettore caratteristico */

typedef int bool;
#define TRUE  1
#define FALSE 0

typedef char TipoLettera;
typedef bool TipoInsLettere['Z' - 'A' + 1];        /* vettore caratteristico */


void InitInsLettere(TipoInsLettere ins)
  /* Inizializza l'insieme di lettere ins all'insieme vuoto ponendo a FALSE
     tutti gli elementi. */
{
  TipoLettera ch;

  for (ch = 'A'; ch <= 'Z'; ch++)
    ins[ch - 'A'] = FALSE;
}  /* InitInsLettere */


bool TestInsiemeVuoto(TipoInsLettere ins)
  /* Restituisce TRUE se ins rappreseta l'insieme vuoto, FALSE altrimenti. */
{
  bool ris = TRUE;
  TipoLettera ch;

  for (ch = 'A'; ch <= 'Z'; ch++) {
    if (ins[ch - 'A'])
      ris = FALSE;
  }
  return ris;
}  /* TestInsiemeVuoto */


void InserisciLettera(TipoInsLettere ins, TipoLettera lettera)
  /* Inserisce lettera nell'insieme di lettere ins. */
{
  ins[lettera - 'A'] = TRUE;
}  /* InserisciLettera */


void EliminaLettera(TipoInsLettere ins, TipoLettera lettera)
  /* Elimina lettera dall'insieme di lettere ins. */
{
  ins[lettera - 'A'] = FALSE;
}  /* EliminaLettera */


bool VerificaAppartenenza(TipoInsLettere ins, TipoLettera lettera)
  /* Restituisce TRUE se lettera appartiene ad ins, FALSE altrimenti. */
{
  return (ins[lettera - 'A']);
}  /* VerificaAppartenenza */


void Unione(TipoInsLettere ins1, TipoInsLettere ins2,
            TipoInsLettere ins_unione)
  /* Restituisce in ins_unione l'unione dei due insiemi ins1 e ins2. */
{
  TipoLettera ch;

  for (ch = 'A'; ch <= 'Z'; ch++)
    ins_unione[ch - 'A'] = (ins1[ch - 'A'] || ins2[ch - 'A']);
}  /* Unione */


void Intersezione(TipoInsLettere ins1, TipoInsLettere ins2,
                  TipoInsLettere ins_int)
  /* Restituisce in ins_int l'intersezione dei due insiemi ins1 e ins2. */
{
  TipoLettera ch;

  for (ch = 'A'; ch <= 'Z'; ch++)
    ins_int[ch - 'A'] = (ins1[ch - 'A'] && ins2[ch - 'A']);
}  /* Intersezione */


void Complemento(TipoInsLettere ins, TipoInsLettere ins_compl)
  /* Restituisce in ins_compl il complemento dell'insieme ins. */
{
  TipoLettera ch;

  for (ch = 'A'; ch <= 'Z'; ch++)
    ins_compl[ch - 'A'] = !ins[ch - 'A'];
}  /* Complemento */