Constructoras

Anuncio
ESPECIFICACIÓN Listas
PARÁMETROS GENÉRICOS
TIPOS TipoElemento
FIN PARÁMETROS
TIPOS TipoLista
OPERACIONES
(* Constructoras generadoras *)
CrearVacia:
→ TipoLista
Construir: TipoElemento
(* Observadoras *)
× TipoLista → TipoLista
PARCIAL Primero : TipoLista
PARCIAL Resto : TipoLista
→ TipoElemento
→ TipoLista
EsVacia : TipoLista
→ Booleano
Longitud : TipoLista → Natural
PARCIAL Ultimo : TipoLista → TipoElemento
Pertenece : TipoElemento × TipoLista → Booleano
(* Constructoras no generadoras *)
Concatenar : TipoLista
× TipoLista → TipoLista
BorrarElemento: TipoElemento × TipoLista → TipoLista
InsertarFinal: TipoElemento x TipoLista → TipoLista
VARIABLES
lista, lista2 : TipoLista;
elemento, elem : TipoElemento;
ECUACIONES DE DEFINITUD
DEF(Primero(Construir(elemento, lista)))
DEF(Resto(Construir (elemento, lista)))
DEF(Ultimo(Construir (elemento, lista)))
ECUACIONES
(* Observadoras *)
Primero(Construir(elemento,lista))
≡ elemento
Resto (Construir (elemento,lista)) ≡ lista
EsVacia (CrearVacia) ≡ CIERTO
EsVacia (Construir (elemento,lista)) ≡ FALSO
Longitud (CrearVacia) ≡ 0
Longitud (Construir (elemento,lista)) ≡ 1 + Longitud (lista)
Ultimo (Construir (elemento,lista)) ≡
SI EsVacia (lista) → elemento
| Ultimo (lista)
Pertenece (elem, CrearVacia)
≡ FALSO
Pertenece (elem, Construir (elemento,lista)) ≡
elem = elemento O Pertenece (elem, lista)
(* constructoras no generadoras *)
Concatenar (CrearVacia, lista2)
≡ lista2
Concatenar (Construir (elemento,lista), lista2) ≡
Construir (elemento, Concatenar (lista, lista2))
BorrarElemento (elem, CrearVacia)= CrearVacia
BorrarElemento (elem, Construir (elemento,lista))=
SI elem = elemento → lista
| Construir(elemento, BorrarElemento (elem,lista))
InsertarFinal (elem, CrearVacia) = Construir(elem, CrearVacia)
InsertarFinal (elem, Construir(elemento,lista)) =
Construir(elemento, InsertarFinal(elem,lista))
1
Listas.ads
GENERIC
TYPE
PACKAGE
TYPE
TYPE
TipoElemento IS PRIVATE;
Listas IS
TipoLista IS LIMITED PRIVATE;
TipoCursor IS PRIVATE;
ListaVacia, MemoriaAgotada,CursorNoValido: EXCEPTION;
PROCEDURE CrearVacia (lista: IN OUT TipoLista);
-- POST: 'lista' es la lista vacía.
-Si 'lista' tiene nodos, éstos se destruyen.
PROCEDURE Construir(e: IN TipoElemento; lista: IN OUT TipoLista );
-- PRE: Queda suficiente espacio en el heap para insertar
-- un nuevo elemento en la lista
-- POST: inserta un nodo conteniendo 'e' al principio de 'lista'.
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
FUNCTION Primero (lista: TipoLista) RETURN TipoElemento;
-- PRE: 'lista' no está vacía
-- POST: devuelve el primer elemento de la lista
-- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía
PROCEDURE Resto (lista: IN TipoLista; resto: IN OUT TipoLista);
-- PRE: 'lista' no está vacía;
-queda suficiente memoria para crear el resto
-- POST: devuelve en 'resto' una copia del resto de 'lista'
-- (todo menos el primer nodo)
-- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía
-'MemoriaAgotada' si no queda memoria
FUNCTION EsVacia (lista: TipoLista) RETURN Boolean;
-- POST: devuelve cierto si 'lista' está vacía.
FUNCTION Longitud (lista: TipoLista) RETURN Natural;
-- POST: devuelve el número de nodos de 'lista'.
FUNCTION Ultimo (lista: TipoLista) RETURN TipoElemento;
-- PRE: 'lista' no está vacía
-- POST: devuelve el último elemento de la lista
-- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía
FUNCTION Pertenece( e: TipoElemento; lista: TipoLista) RETURN Boolean;
-- POST: devuelve cierto si 'e' está en 'lista'
PROCEDURE InsertarFinal(lista: IN OUT TipoLista; e: IN TipoElemento);
-- PRE: Queda suficiente espacio en el heap para insertar
-- un nuevo elemento en la lista
-- POST: 'lista' es una nueva lista cuyo último elemento es 'e'
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
PROCEDURE Concatenar (l1:IN TipoLista ; l2:IN TipoLista; salida:IN OUT TipoLista);
-- PRE: Queda suficiente espacio en el heap para crear la concatenación
-- POST: 'salida' es una nueva lista cuyo contenido es una copia de la
-concatenación de 'l1' y 'l2'
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
PROCEDURE BorrarElemento ( e: IN TipoElemento; lista: IN OUT TipoLista);
-- POST: Elimina de 'lista' la primera aparición de 'e' (si la hay).
PROCEDURE Copiar (destino: IN OUT TipoLista; origen: IN TipoLista);
-- PRE: Queda suficiente espacio en el heap para crear la concatenación
--POST: Devuelve en 'destino' una copia completa de 'origen'.
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
2
FUNCTION "="(lista1, lista2: TipoLista) RETURN Boolean;
-- POST: devuelve cierto si 'lista1' y 'lista2' son iguales
PROCEDURE Destruir (lista: IN OUT TipoLista);
-- POST: Elimina todos los nodos de 'lista' de la memoria
FUNCTION Elemento(lista: TipoLista; c: TipoCursor) RETURN TipoElemento;
-- PRE: 'c' es un cursor válido
-- POST: devuelve el elemento asociado a 'c'
-- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido
PROCEDURE Insertar(lista: IN OUT TipoLista; c: IN TipoCursor;
ele: IN TipoElemento; detras: IN Boolean := True);
-- PRE: Queda suficiente espacio en el heap
-- POST: inserta un nodo con elemento 'ele' inmediatamente detrás
-- (si el parámetro 'detras' es cierto o no se facilita)
-- o inmediatamente delante (si el parámetro 'detras' es falso)
-- del nodo apuntado por el cursor 'c'. Si el cursor 'c'
-- no es válido, se inserta el nuevo nodo al final de la lista.
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
PROCEDURE Reemplazar(lista: IN OUT TipoLista; c: IN TipoCursor;
ele: IN TipoElemento);
-- PRE: 'c' es un cursor válido
-- POST: asigna 'ele' al nodo apuntado por 'c'
-- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido
PROCEDURE Eliminar(lista: IN OUT TipoLista; c: IN OUT TipoCursor);
-- PRE: 'c' es un cursor válido
-- POST: elimina el elemento apuntado por 'c' de la lista. 'c' toma
-- el valor de salida "Siguiente(c)"
-- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido
FUNCTION PrimerCursor(lista: TipoLista) RETURN TipoCursor;
-- POST: Devuelve un cursor apuntando al primer elemento de
-- 'lista'. Si ésta es vacía, devuelve un cursor no válido.
FUNCTION UltimoCursor(lista: TipoLista) RETURN TipoCursor;
-- POST: Devuelve un cursor apuntando al último elemento de
-- 'lista'. Si ésta es vacía, devuelve un cursor no válido.
FUNCTION Siguiente(lista: TipoLista; c: TipoCursor) RETURN TipoCursor;
-- PRE: 'c' es un cursor válido
-- POST: Devuelve un cursor apuntando al siguiente de ‘c’ o un cursor
-- no válido si ‘c’ no tiene siguiente.
-- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido
FUNCTION Anterior(lista: TipoLista; c: TipoCursor) RETURN TipoCursor;
-- PRE: 'c' es un cursor válido
-- POST: Devuelve un cursor apuntando al nodo anterior
-- al que apunta 'c'. Si no hay ningún nodo delante de 'c',
-- se devuelve el cursor no válido
-- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido
FUNCTION EsCursorValido(lista: TipoLista; c: TipoCursor) RETURN Boolean;
-- POST: Devuelve cierto si 'c' apunta a algún nodo de ‘lista’
FUNCTION EsPrimero(lista: TipoLista; c: TipoCursor) RETURN Boolean;
-- POST: Devuelve cierto si 'c' apunta al primer nodo de ‘lista’
FUNCTION EsUltimo(lista: TipoLista; c: TipoCursor) RETURN Boolean;
-- POST: Devuelve cierto si 'c' apunta al último nodo de ‘lista’
...
3
Pilas.ads
GENERIC
-- Parámetro del TAD
TYPE TipoElemento IS PRIVATE;
PACKAGE Pilas IS
-- definición privada y limitada del tipo de datos
TYPE TipoPila IS LIMITED PRIVATE;
-- excepciones
PilaVacia : EXCEPTION;
-MemoriaAgotada : EXCEPTION; --
la pila está vacía
no queda espacio en memoria
--Operaciones Constructoras Generadoras
PROCEDURE CrearPilaVacia (pila : IN OUT TipoPila);
-- POST:
'pila' se convierte en la pila vacía
PROCEDURE Apilar (e : IN TipoElemento; pila : IN OUT TipoPila);
-- PRE: La memoria dinámica no está llena
-- POST: Inserta un nodo conteniendo 'e' en la cima de 'pila'
-- EXCEPCIÓN: 'MemoriaAgotada' si la memoria dinámica está llena
-- Operaciones Observadoras Selectoras
FUNCTION Cima (pila : TipoPila) RETURN TipoElemento;
-- PRE:
'pila' no está vacía
-- POST:
Devuelve el elemento que está en la cima de 'pila'
-- EXCEPCIÓN: 'PilaVacia' si 'pila' está vacía
-- Operaciones Observadoras no Selectoras
FUNCTION EsPilaVacia (pila : TipoPila) RETURN Boolean;
-- POST: Devuelve cierto si 'pila' está vacía
-- Operaciones Constructoras no Generadoras
PROCEDURE Desapilar (pila : IN OUT TipoPila);
-- PRE:
'pila' no está vacía
-- POST:
elimina la cima de 'pila'
-- EXCEPCIÓN: 'PilaVacia' si 'pila' está vacía
-- Otras operaciones
PROCEDURE Copiar (destino: IN OUT TipoPila;
origen: IN TipoPila);
-- PRE: La memoria dinámica no está llena
-- POST: Devuelve en 'destino' una copia completa de 'origen'.
-- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena
FUNCTION "=" (pila1, pila2: TipoPila) RETURN Boolean;
-- POST: devuelve cierto si 'pila1' y 'pila2' son iguales
PROCEDURE Destruir (pila: IN OUT TipoPila);
-- POST: Elimina todos los nodos de 'pila' de la memoria
PRIVATE
...
END Pilas;
4
Descargar