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