/*************** Practica 02. Implementacion clase conjunto********************
 *
 *  Nombre de Fichero: conjunto.cpp
 *
 *  Proposito: En este programa se implementan los diferentes metodos de la
 *             clase conjunto
 *
 *  Condiciones de Final Anormal y Mensajes de Error y Advertencia
 *
 *  --> No hay final anormal
 *
 *  --> No hay mensajes de error y advertencia
 *
 *  Historia de Desarrollo:
 *  Fecha     Autor           Id Cambio  Version  Descripcion del cambio
 *  --------  --------------  ---------  -------  ----------------------
 *  15-03-02  Ricardo Ferris          0      1.0
 *
 *****************************************************************************/
#include <iostream.h>
#include "conjunto.h"

/*************** IniciarConjunto *****************************************
 *
 *  Prototipo:    void conjunto::IniciarConjunto (void)
 *
 *  Descripcion:  Este metodo inicia el conjunto a vacio (pone el valor
 *                privado 'n' a cero)
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  ninguno
 *
 *  Valor devuelto:
 *  Ninguno
 *
 ************************************************************************/
void Conjunto::IniciarConjunto (void)
{
   n = 0;
}

/*************** AnadirElemento ******************************************
 *
 *  Prototipo:    bool conjunto::AnadirElemento (int x)
 *
 *  Descripcion:  Este metodo anade el elemento x al conjunto. Si el
 *                elemento existia en el conjunto, no lo guarda.
 *                Si no caben mas elementos en el conjunto devuelve error
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  x               entero      E    Valor que quiero guardar en el
 *                                   conjunto
 *
 *  Valor devuelto:
 *  bool    Error en la insercion del elemento
 *          true  -> Hay error. El elemento no cabe en el conjunto
 *          false -> No hay error.
 *
 ************************************************************************/
bool Conjunto::AnadirElemento (int x)
{
   bool error;
   int i;

   /*
    * Si 'n' vale Max ya no me caben mas elementos en el conjunto
    */
   if (n == MAX)
      error = true;
   else
   {
      error = false;
      /*
       * Miro si el elemento 'x' ya estaba en el conjunto
       */
      i = 0;
      while ( (i < n) && (v[i] != x) )
         i++;

      /*
       * Si no estaba en el conjunto (no lo he encontrado en el vector),
       * lo pongo al final
       */
      if (i == n)
      {
         v[n] = x;
         n++;
      }
   }

   return error;
}

/*************** BorrarElemento ******************************************
 *
 *  Prototipo:    bool conjunto::BorrarElemento (int x)
 *
 *  Descripcion:  Este metodo elimina el elemento x del conjunto. Si el
 *                elemento existia en el conjunto, lo elimina.
 *                Sino devuelve error.
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  x               entero      E    Valor que quiero eliminar del
 *                                   conjunto
 *
 *  Valor devuelto:
 *  bool    Error en la eliminacion del elemento
 *          true  -> Hay error. El elemento no estaba en el conjunto
 *          false -> No hay error.
 *
 ************************************************************************/
bool Conjunto::BorrarElemento (int x)
{
   bool error;
   int i, j;

   /*
    * Busco el elemento en el conjunto
    */
   i = 0;
   while ( (i < n) && (v[i] != x) )
      i++;

   /*
    * Si no encuentro el elemento devuelvo error
    */
   if (i == n)
      error = true;
   else
   {
      error = false;
      /*
       * Si encuentro el elemento, lo elimino del vector, moviendo los
       * elementos posteriores sobre la posicion sonde estaba el elemento
       * y digo que tengo un elemento menos (n--)
       */
      for (j = i + 1; j < n; j++)
         v[j - 1] = v[j];
      n--;
   }

   return error;
}

/*************** BorrarElemento ******************************************
 *
 *  Prototipo:    bool conjunto::BorrarElemento (int x)
 *
 *  Descripcion:  Este metodo elimina el elemento x del conjunto. Si el
 *                elemento existia en el conjunto, lo elimina.
 *                Sino devuelve error.
 *
 *  Parametros:
 *  Nombre          Tipo        E/S  Descripcion
 *  ------          ----------  ---  ------------
 *  x               entero      E    Valor que quiero eliminar del
 *                                   conjunto
 *
 *  Valor devuelto:
 *  bool    Error en la eliminacion del elemento
 *          true  -> Hay error. El elemento no estaba en el conjunto
 *          false -> No hay error.
 *
 ************************************************************************/
bool Conjunto::EsConjuntoVacio (void)
{
   return n == 0;
}

bool Conjunto::Pertenece (int x)
{
   bool b_aux;
   int i;

   i = 0;
   while ( (i < n) && (v[i] != x) )
      i++;

   if (i == n)
      b_aux = false;
   else
      b_aux = true;

   return b_aux;
}

