Está en la página 1de 11

Paradigmas de Programacin

Programacin Procedural. TADs.


Repaso de las principales caractersticas de la programacin procedural.
Caractersticas de los lenguajes imperativos:
Son los lenguajes orientados a sentencias. La unidad de trabajo es la
sentencia. Los efectos de las sentencias individuales se combinan en un
programa para obtener los resultados deseados. Todos estos lenguajes se
basan fundamentalmente en la arquitectura tradicional de la computadora. Esto
se puede ver en tres caractersticas principales:
variables: La componente principal de la arquitectura es la memoria, que
consta de un gran nmero de celdas. Es el lugar donde se almacenan los
datos. Los valores se almacenan en las celdas y se puede acceder a ellas
dando un nombre a dichas celdas. Esto est representado por el concepto
de variable.
operacin de asignacin: Estrechamente ligado a la arquitectura de la
memoria se encuentra la idea de que el valor calculado debe ser
almacenado, es decir, asignado a una celda. Esta es la razn de la
importancia de la sentencia de asignacin.
repeticin: un programa en un lenguaje imperativo, normalmente realiza su
tarea ejecutando repetidamente una secuencia de pasos elementales. Esto
es una consecuencia de la arquitectura, en la cual las instrucciones se
almacenan en memoria y la nica manera de llevar a cabo algo complicado
es repitiendo una secuencia de instrucciones.
El papel de la abstraccin
Como cualquier modelo, un programa es una abstraccin de la realidad.
recordamos que, la abstraccin es el proceso de identificacin de las
propiedades importantes del problema que se est modelando, ignorando los
detalles irrelevantes.
La abstraccin es el concepto clave en la teora de la programacin. En
concreto, tiene una doble relacin con los lenguajes de programacin. Por un
lado, los lenguajes son las herramientas con las que los diseadores pueden
implementar los modelos abstractos (los programas). Por el otro, ellos mismos
son abstracciones del procesador sobre el cual se implementa el modelo. Sin
embargo, los primeros lenguajes no reconocan el papel crucial que la
abstraccin juega en la programacin. Por ejemplo, a comienzos de la dcada
del 50, el nico mecanismo de abstraccin proporcionado por los lenguajes
(ensambladores) sobre los lenguajes de mquina era la denominacin
simblica: se utilizaban mnemotcnicos o trminos relativamente
autoexplicativos para denominar cdigos de operacin y posiciones de
memoria.
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 2
Los subprogramas fueron tambin introducidos en los lenguajes de tipo
ensamblador como un mecanismo para denominar una actividad descrita por un
grupo de acciones y considerarla como una nica accin. Los subprogramas
son mecanismos tiles para la construccin de abstracciones. Un subprograma
es la implementacin de una abstraccin mientras que la llamada a un
subprograma representa el uso de la abstraccin. Cuando el programador
implementa un subprograma se encuentra en el cmo trabaja dicho
subprograma. Cuando se invoque este subprograma, ya no nos interesa el
cmo sino el qu hace. Esto se conoce como abstraccin procedural.
Tambin es posible definir abstracciones de datos. Las abstracciones
de datos modelan los datos manipulados por el programa.
Abstracciones de datos. Cmo aparecen en los lenguajes.
Los lenguajes a nivel de la mquina vean a los datos almacenados como
cadenas de bits que podan ser manipulados por las instrucciones de la
mquina. El repertorio de instrucciones inclua operaciones de desplazamientos,
lgicas, aritmticas en pto. flotante, etc.
Fortran, Cobol y Algol 60 dieron su primer paso hacia la introduccin a la
abstraccin de datos. En estos lenguajes, la informacin almacenada en
determinadas posiciones de memoria no se ve como una secuencia de bits
annimos, sino como un valor entero, real, lgico, etc. Cada lenguaje tenia un
propsito fijo y de acuerdo a esto provea los tipos adecuados. Como resultado,
ninguno de estos lenguajes resulto apropiado para TODAS las aplicaciones, ya
que el programador estaba limitado por la rigidez del conjunto fijo de
abstracciones proporcionado por el lenguaje.
El objetivo perseguido por los lenguajes de la siguiente generacin
(Simula 67, Algol 68, Pascal) era incorporar mecanismos flexibles y fciles de
usar por medio de los cuales el programador pueda definir nuevas
abstracciones.
Algol 68 y Pascal permiten al programador usar tipos de datos
incorporados y constructores de nuevos tipos (matrices, registros).
Ejemplo: En Pascal:
type
estudiante=record
nombre:string[30];
legajo:integer;
end;
curso=array[1..60] of estudiante;
var
grupo_A:curso;
El tipo estudiante es una estructura de datos que consta de dos
componentes utilizado para guardar una identificacin de un estudiante. El tipo
curso se define como una coleccin (arreglo) de estudiantes.
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 3
Si quiero manipular los estudiantes de un curso, podra definir
procedimientos tales como:
Insertar(grupo_A, unEstud);
Eliminar(grupo_A, unEstud);
Imprimir(grupo_A);
etc.
Estos procedimientos estn fuertemente relacionados con el tipo curso.
En concreto, son las operaciones que manipulan los objetos del tipo curso. Sin
embargo, esta relacin lgica no queda evidente en el programa:
Ejemplo:
program demo;
type
............ // se mezclan con otros tipos
var
............ // se mezclan con otras variables
Proc,....
............ // se mezclan con otros procedimientos
begin
............
end.
Hay semejanzas entre los tipos definidos por el usuario de Pascal y los
tipos predefinidos. Por ejemplo, consideremos el tipo predefinido integer y el
tipo definido por el usuario curso. Los dos tipos son abstracciones construidas
sobre una representacin interna: una cadena de bits para los integer y un
arreglo de registros para curso. Los dos tipos tienen asociados un conjunto de
operaciones: operaciones aritmticas y de comparacin para los integer e
Insertar(..), Eliminar(..), Imprimir(..), etc. para curso.
Sin embargo, los tipos predefinidos y los tipos definidos por el usuario
difieren uno del otro en un aspecto muy importante. Los tipos predefinidos
ocultan al programador la representacin interna: sta no puede ser
manipulada directamente. Por ejemplo, el programador no puede acceder a un
bit en particular de la cadena de bits que representan al integer (si no dispone
de operaciones provistas para tal fin, obviamente). Por otra parte, los
procedimientos Insertar(..), Eliminar(..), Imprimir(..), etc., no son los nicos
medios para manipular un objeto de tipo curso. El programador puede operar
directamente sobre cada registro que compone el arreglo, sin estar obligado a
utilizar exclusivamente las operaciones definidas para el nuevo tipo.
Ejemplo:
grupo_A[15].legajo:=12345;
En otras palabras, desde el punto de vista del lenguaje, no hay distincin
entre dos niveles de abstraccin: el nivel en el que se pueden utilizar cursos
como objetos nuevos y el nivel en el que se puede considerar la representacin
de los cursos en trminos de las abstracciones de mas bajo nivel.
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 4
Esta confusin entre niveles de abstraccin puede conducir a la
produccin de programas difciles de leer y lo que es ms importante, reduce la
modificabilidad de los mismos. Por ejemplo, si cambiamos la representacin
interna de los cursos a listas encadenadas necesitaramos cambiar todos los
accesos directo a la representacin interna (como la sentencia anterior) a los
largo de todo el programa.
En conclusin, si queremos definir nuevos tipos de datos en un
programa, seria deseable que el lenguaje me permitiera asociar una
representacin con las operaciones para manipularla en una unidad adecuada
del lenguaje (separada del programa) y ocultar la representacin interna del
nuevo tipo a las unidades que la usa.
Los tipos definidos por el usuario que satisfacen estas dos propiedades
se denominan tipos abstractos de datos (TAD). La primer propiedad hace
que la versin final del programa refleje las abstracciones descubiertas durante
la fase de diseo. La segunda propiedad enfatiza la distincin entre los niveles
de abstraccin y favorece la modificabilidad de los programas.
Pascal, en su definicin original, no provea ningn mecanismo para la
construccin de TADs. Turbo Pascal tiene herramientas para cubrir la primer
propiedad (encapsular la definicin del tipo con las operaciones para
manipularlo en una unit) pero no para ocultar la estructura interna del tipo.
Ms adelante vamos a ver otro lenguaje (ADA) que provee mecanismos
que cubren las dos propiedades.
Ahora vamos a ver cmo se disea utilizando TADs, cmo se identifica
un TAD en un problema. Antes vamos a recordar algunos principios de la
abstraccin procedural o la tcnica de diseo por refinamientos sucesivos..
REPASO:
Abstraccin de procedimientos (refinamientos sucesivos)
Es el principio subyacente de la programacin utilizando el diseo topdown
(refinamientos sucesivos). Las ventajas de este estilo de programacin ya
las vimos en el semestre pasado (en la materia Sintaxis y ..), pero vamos a
recordarlos:
es un mtodo que hace que la complejidad de un programa grande sea
manejable, controlando sistemticamente la interaccin entre sus
componentes.
Esto es, un programa modular es ms fcil de escribir, ya que enfocamos
nuestra atencin en una tarea (procedimiento o funcin) a la vez.
La idea es que sabe qu es lo que hace un mdulo y no cmo lo hace.
O sea, desde afuera NO PUEDO (no interesa) ver detalles de implementacin de
ese mdulo. Es como si estara rodeado de paredes (walls) que impiden que
otros mdulos sepan (vean) cmo fue implementado. Para poder utilizar los
mdulos debemos especificar la forma en que se interacta con ellos, es decir
debemos establecer un contrato en el cual se especifica cmo se lo debe
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 5
invocar (con qu parmetros, de qu tipo, etc.) y qu se obtendr como
resultado luego de ejecutar el mdulo.
Todo esto no es nuevo. Es lo que vimos anteriormente sobre
refinamientos sucesivos, solo que ahora formalizamos un poquito ms el
concepto.
request
retorno de la op.
La abstraccin procedural particiona un programa en algoritmos
independientes, los cuales ejecutan tareas ms pequeas. Se piensa en
trminos de qu es lo que un algoritmo hace, independientemente de cmo lo
hace.
En la abstraccin de datos se piensa qu puedo hacer con una coleccin
de datos independientemente de cmo lo voy a hacer.
La abstraccin de datos es una herramienta que nos permite desarrollar
las estructuras de datos en una forma relativamente independiente del resto de
la solucin. Los otros mdulos de la solucin conocern qu operaciones
pueden hacer con los datos pero no cmo estn almacenados ni cmo se
ejecutarn las operaciones.
Ya vimos qu era un TAD: una coleccin de datos, ms el conjunto de
operaciones para manipularlos. La definicin de las operaciones debe ser
rigurosa, para especificar completamente el efecto que tiene sobre los
datos, pero no se especificar si los datos se almacenarn en posiciones
consecutivas de memoria, o en posiciones disjuntas, ni nada. Cuando se
implementa el TAD se elige una representacin particular, una estructura de
datos (recordemos que son construcciones que provee el lenguaje para guardar
datos, por ejemplo, un array en Pascal).
Un TAD no es lo mismo que una estructura de datos. Por ejemplo, la
estructura de datos curso definida anteriormente no es un TAD.
Cuando un programa debe ejecutar operaciones sobre sus datos que no
estn soportadas directamente por el lenguaje, se debe construir la estructura
de datos. Primero debera disear el TAD y entonces cuidadosamente
especificar las operaciones (el contrato). Entonces (y slo entonces), debera
implementar las operaciones con una estructura de datos. Si se implementan las
operaciones apropiadamente, el resto del programa ser capaz de ejecutar las
operaciones segn fueron especificadas.
Programa
que usa una
tarea
Implementa
cin de la
tarea
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 6
En resumen, se usa el mismo concepto que para la abstraccin
procedural: hay paredes (walls) entre un programa y sus estructuras de
datos. El contrato define qu operaciones puedo realizar con la estructura de
datos y qu resultados obtengo luego de ejecutar esas operaciones.
request
return
Ejemplo: TAD lista ordenada
Consideremos una lista cualquiera (la lista del super, por ejemplo).
harina
arroz
gaseosas
huevos
yerba
azcar
.......
El orden est dado por el orden en el cual se me fueron ocurriendo las
cosas (no necesariamente es un orden alfabtico, slo que un tem tiene un
anterior y un siguiente)
Ahora pensemos, qu cosas podra hacer con la lista?
contar los tems para saber cuntas cosas tengo que comprar
(la longitud de la lista);
agregar un elemento en la pos. i de la lista;
eliminar el elemento de la posicin i;
ver el tem que est en la posicin i.
Cmo especificamos estas operaciones?
Procedure Crear(L)
{ Crea una lista ordenada L vaca}
Function Longitud(L) : integer
Programa
que usa la
estructura
de datos
Implementa
cin de la
estructura
de datos
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 7
{ Retorna el numero de tems que estn en la lista ordenada L}
Procedure Insertar(L, i, nuevo-item)
{ Inserta el nuevo-item en la posicin i de la lista. El valor de i debe estar en el rango de 1 a
Longitud(L)+1. Si i<=Longitud(L), los tems son desplazados como sigue: el tem de la posicin i
pasa a la posicin i+1, el de la posicin i+1 a la i+2, etc. y el de la posicin Longitud(L), pasa a
la posicin Longitud(L)+1. }
Procedure Eliminar(L,i)
{ Elimina el tem de la posicin i de la lista ordenada L. El valor de i debe estar en el rango de 1
a Longitud(L). Si i<Longitud(L), los tems son desplazados como sigue: el tem de la posicin
i+1 pasa a la posicin i, el de la posicin i+2 a la i+1, etc. y el de la posicin Longitud(L), pasa a
la posicin Longitud(L)-1. }
Function Recuperar(L, i) : <tipo correspondiente a los tems>
{ Retorna el tem que se encuentra en la posicin i de la lista ordenada L. El valor de i debe
estar en el rango de 1 a Longitud(L). La lista no cambia luego de esta operacin (esta
operacin no altera la lista)}
Las especificaciones de estas 5 operaciones son los trminos del
contrato para el TAD lista ordenada. Notemos que estas especificaciones no
mencionan cmo se almacena la lista ordenada ni cmo se implementan las
operaciones. La definicin del TAD nicamente dice lo que se puede hacer con
una lista ordenada.
Ejemplo:
Si queremos hacer una pequea aplicacin que intercambie dos
elementos de la lista que se encuentran en las posiciones i y j respectivamente:
Procedure Cambiar(L, i, j)
{ cambia el imo. y el j mo. elemento de la lista ordenada L}
primero:= Recuperar(L, i); {Copia el i mo. tem}
segundo:= Recuperar(L, j); {Copia el j mo. tem}
Eliminar(L.i); { Reemplaza el i mo. tem con el j mo.}
Insertar(L, i, segundo);
Eliminar(L.j); { Reemplaza el j mo. tem con el i mo.}
Insertar(L, j, primero);
Notar que esta aplicacin NO necesita saber cmo est implementada la lista.
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 8
Diseando un TAD
El diseo de un TAD surge naturalmente durante el proceso de la
resolucin del problema. Cuando Pascal (o el lenguaje que se va a utilizar) no
provee los tipos convenientes y un tipo definido por el usuario no es suficiente,
ya que no se puede definir las operaciones y las restricciones, entonces se
piensa en un TAD.
Ejemplo: Supongamos que queremos imprimir todas las fechas que sean
feriados del almanaque de un determinado ao. Una posible solucin sera:
tomar la fecha correspondiente al primer da del ao
while la fecha no corresponda con el ltimo dia del ao
do begin
if la fecha corresponde a un da feriado
then Imprimirla
tomar la siguiente fecha
end;
En este problema aparace un tipo no provisto por Pascal: el tipo fecha.
Una fecha contiene dia, mes y ao. Qu operaciones seran necesarias?
determinar la fecha correspondiente al 1er. da del ao.
determinar si una fecha corresponde al ltimo da del ao.
determinar si una fecha es o no feriado.
dado una fecha, determinar la fecha siguiente.
Cmo las especificamos?
Function PrimerDia(): fecha
{Retorna la fecha correspondiente al primer dia del ao}
Function EsUltimoDia(unaFecha): boolean
{Retorna verdadero si unaFecha corresponde al ltimo da del ao}
Function EsFeriado(unaFecha): boolean
{Retorna verdadero si unaFecha corresponde a un da feriado}
Function SiguienteFecha(unaFecha): fecha
{Retorna la fecha del dia siguiente al la fcha dada}
Cmo quedara la solucin a nuestro problema en funcin del TAD fecha?
dia:= PrimerDia();
while not EsUltimoDia(dia)
do begin
if EsFeriado(dia)
then Imprimir(dia) (***)
dia:= SiguienteFecha(dia)
end;
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 9
(***) En realidad, en este punto, nos damos cuenta que no podemos imprimir un
dato tipo fecha (porque no conocemos nada de l). Por lo tanto, necesitamos
definir ms operaciones al TAD que no devuelvan el dia, mes y ao de una
fecha dada y luego imprimir estos valores.
Function Dia(unaFecha): integer
{ Retorna el da de la fecha dada. El da estar en el rango de 1 a 31}
Function Mes(unaFecha): integer
{ Retorna el mes de la fecha dada. El mes estar en el rango de 1 a 12}
Function Anio(unaFecha): integer
{ Retorna el ao de la fecha dada. El ao estar en el rango de 0 a 2500}
Anteriormente diseamos el TAD en funcin del problema/aplicacin a
resolver. Tambin podemos disar el TAD y luego utilizarlo en alguna aplicacin
(hacer el proceso inverso)
Ejemplo: Vamos a disear el TAD Agenda. Qu operaciones necesitamos
proveer para manejar una agenda?
Las ms obvias:
agendar una actividad en un dia y hora determinado
desagendar una acctividad previamente agendado en un dia y hora
determinado
Podemos pensar en otras dos operaciones que complementan las
anteriores.
ver si hay una actividad agendad en un horario y dia determinado
ver qu actividad est agendada en un horario y dia determinado
Estas dos operaciones podramos combinarlas y especificarlas como una sola
operacin.
Especificaciones:
Function CrearAgenda(): agenda
{ Retorna una agenda vaca}
Procedure Agendar(unaAgenda, fecha, hora, actividad)
{ Agrega en la agenda la actividad en el dia y hora dado asumiendo que ese horario est libre}
Procedure Desagendar(unaAgenda, fecha, hora)
{ Borra la actividad agendada en la fecha y hora dada}
Procedure VerActividad(unaAgenda, fecha, hora, hayActividad, unaActividad)
{determina si existe o una actividad agendada en la fecha y hora dada. Si hay, setea hayAct en
true y retorna la actividad agendad en unaActividad. Si no hay nada agendado setea hayAct en
false}
Aplicacin:
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 10
Supongamos que queremos cambiar el da y hora de una actividad
particular (esto que lo hagan ellos - a lo sumo en la prctica)
Leer(diaAnt, horaAnt, diaNuevo, horaNueva,);
VerActividad(agenda, diaAnt, horaAnt, hayAct, acti);
if hayAct { verifico que verdaderamente estaba algo agendado}
then begin
VerActividad(agenda, diaNuevo, horaNueva, hayAct, acti);
if hayAct { si ya tengo algo agendado en ese horario}
then write(Ud. ya tiene agendada otra actividad en el nuevo horario)
else { el horario est libre}
begin
Agendar(agenda, diaNuevo, horaNueva, acti);
Desagendar(agenda, diaAnt, horaAnt);
end;
end;
else write(Ud. no tiene agendada ninguna actividad en ese horario);
Al disear TADs nos podemos encontrar con otros TADs. por ejemplo,
en el TAD anterior (agenda) hacemos referencia a fechas, y stas podran ser
datos abstractos.
Esto es, se puede utilizar un TAD para implementar otro TAD.
Otro Ejemplo: queremos armar una base de datos de recetas (un recetario). Las
operaciones para manipularlo sera:
Procedure Crear(recetario)
{Crea un recetario vaco}
Procedure Insertar(recetario, receta)
{Agrega la receta al recetario. Se asume que la receta NO est en el recetario}
Procedure Eliminar(recetario, receta)
{Elimina la receta del recetario. Asume que la receta est en el recetario}
Function Recuperar(recetario, nombreReceta): Receta
{Retorna la receta del recetario cuyo nombre coincide con nombreReceta}
Function Esta(recetario, nombreReceta):Boolean
{ Retorna true si la receta cuyo nombre es nombreReceta est en el recetario y false en caso
contrario}
En este caso, podramos pensar en definir otro TAD: Receta que
contengan la informacin de una receta, con operaciones como:
Function Nombre(receta): string[50]
{Retorna el nombre de la receta}
Esta funcin sera utilizada por las operaciones Recuperar y Esta para
obtener el nombre de las recetas y compararlos con el nombreReceta recibido
como parmetro en el momento de implementar el TAD recetario.
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 11
Implementacin de TADs
Tenemos que ver cmo guardar los datos y cmo realizar las operaciones
especificadas anteriormente.
TAD Lista Ordenada.
Tenemos dos opciones para almacenar los datos:
utilizar arreglos
utilizar punteros (listas encadenadas)
Recordamos la especificacin del TAD:
Procedure Crear(L)
{ Crea una lista ordenada L vaca}
Function Longitud(L) : integer
{ Retorna el numero de tems que estn en la lista ordenada L}
Procedure Insertar(L, i, nuevo-item)
{ Inserta el nuevo-item en la posicin i de la lista. El valor de i debe estar en el rango de 1 a
Longitud(L)+1. Si i<=Longitud(L), los tems son desplazados como sigue: el tem de la posicin i
pasa a la posicin i+1, el de la posicin i+1 a la i+2, etc. y el de la posicin Longitud(L), pasa a
la posicin Longitud(L)+1. }
Procedure Eliminar(L,i)
{ Elimina el tem de la posicin i de la lista ordenada L. El valor de i debe estar en el rango de 1
a Longitud(L). Si i<Longitud(L), los tems son desplazados como sigue: el tem de la posicin
i+1 pasa a la posicin i, el de la posicin i+2 a la i+1, etc. y el de la posicin Longitud(L), pasa a
la posicin Longitud(L)-1. }
Function Recuperar(L, i) : <tipo correspondiente a los tems>
{ Retorna el tem que se encuentra en la posicin i de la lista ordenada L. El valor de i debe
estar en el rango de 1 a Longitud(L). La lista no cambia luego de esta operacin (esta
operacin no altera la lista)}
Implementacin basada en arreglos.
................. .
Longitud Items
Podra definir la lista como un registro con dos campos:la longitud de la
lista y los tems en s.
const maxlen=100;
type itemType=<tipo de los items de la lista>
listaOrdenada=record
long:integer;
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 12
items:array[1..maxlen] of itemType;
end;
var L:listaOrdenada;
algunas de las operaciones quedaran:
Procedure Crear (var L: listaOrdenada)
{ Crea una lista ordenada L vaca}
begin
L.Long:=0;
end;
Function Longitud(L:listaOrdenada): integer;
{ Retorna el numero de tems que estn en la lista ordenada L}
begin
Longitud:=L.long;
end;
Procedure Insertar(var L: listaOrdenada; i:integer; nuevoItem:itemType)
{ Inserta el nuevo-item en la posicin i de la lista. El valor de i debe estar en el rango de 1 a
Longitud(L)+1. Si i<=Longitud(L), los tems son desplazados como sigue: el tem de la posicin i
pasa a la posicin i+1, el de la posicin i+1 a la i+2, etc. y el de la posicin Longitud(L), pasa a
la posicin Longitud(L)+1. }
begin
if ((i<1) and i>Longitud(L)+1) or (Longitud(L)=maxlen)
then Indicar que hay un ERROR
else begin
{desplazar los tems}
for j:= Longitud(L) downto i do
L.items[j+1]:=L.items[j];
{ Insertar el nuevo item}
L.items[i]:= nuevoItem;
L.long:=L.long+1;
end;
end;

Implementacin basada en punteros (listas encadenadas)
long head item sgte
Para no tener la restriccin del tamao fijo del arreglo.
type itemType=<tipo de los items de la lista>
ptr = .. nodo;
nodo =record
item: itemtype;
sigte:ptr;
end;
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 13
listaOrdenada=record
long:integer;
head:ptr;
end;
var L:listaOrdenada;
las operaciones quedaran:
Procedure Crear (var L: listaOrdenada)
{ Crea una lista ordenada L vaca}
begin
L.long:=0;
L.head:=nil;
end;
Function Longitud(L:listaOrdenada): integer;
{ Retorna el numero de tems que estn en la lista ordenada L}
begin
Longitud:=L.long;
end;
Para implementar las otras operaciones necesitamos acceder a la
posicin i de la lista, cosa qu la estructura elegida no me lo provee (las listas
enganchadas no tienen acceso directo a sus componenetes). Por lo tanto,
podramos pensar en definir una operacin propia del TAD llamasda SetPtr,
que retorna el puntero al nodo que se encuentra en una posicin especificada.
Otra vez, esta operacin NO estara disponible para las aplicaciones que usen
la lista ordenada, sino que la es privada del TAD, me sirve para implementar
las operaciones restantes.
Function SetPtr(L: listaOrdenada; i:integer):ptr
{Retorna un puntero al nodo que se encuentra en la posicin i.
Si i<1 o i>Longitud(L), retorna un puentero nulo}
begin
if (i<1) or (i>Longitud(L))
then SetPtr:= nil
else begin
p:=L.head;
for j:=1 to i-1 do p:=p..sigte;
SetPtr:=p;
end;
end;
algunas de las operaciones quedaran:
PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com
UTN.- Paradigmas de Programacin. 2009
TADs - Pgina 14
Function Recuperar (L: listaOrdenada; i:integer)
{ Retorna el tem que se encuentra en la posicin i de la lista ordenada L. El valor de i debe
estar en el rango de 1 a Longitud(L). La lista no cambia luego de esta operacin (esta
operacin no altera la lista)}
begin
if (i<1) or i>Longitud(L)
then Indicar que hay un ERROR
else begin
p:=SetPtr(i);
Recuperar := p..item; { No testeo por p<>nil porque ya lo testee al ppio.}
end;
end;

PDF Created with deskPDF PDF Writer - Trial :: http://www.docudesk.com

También podría gustarte