|
Clase Práctica # 6: Trabajo General con Listas Secuenciales Objetivos Que los estudiantes desarrollen habilidades en el tratamiento general de listas secuenciales en la resolución de problemas de mediana complejidad. Introducción Recordar los elementos fundamentales del uso de los métodos FirstThat y ForEach en el recorrido de una lista para resolver un problema. Desarrollo Ejercicio # 1 Implemente un TDA que representa a una lista que tiene además de sus operaciones tradicionales una que permite dividir la lista, en dos sublistas, a partir de un elemento que cumpla una condición. Orientaciones - Recomendar definir una nueva clase que herede de TGeneralListSeq y contenga el método.
- El método debe devolver true o false en dependencia de si se pudo dividir o no, pues puede ser que no exista ningún elemento que cumpla la condición.
R/ Uses List; type TList = class(TGeneralListSeq) public function Dividir(Condicion:TFunctionTest; var L: TList): boolean; end; Function TList.Dividir(Condicion: TFunctionTest; var List: TList): boolean; var aItem: Pointer; i: TIndexRange; begin Result := false; if not Empty then begin aItem := FirstThat(Condicion); if aItem <> nil then begin Result := true; List.Create; For i := Fcursor to Last do begin aItem := DeleteAtCursor; Result := List.Insert(aItem); end; end; end; end; C/ - Notar que el ciclo for..to evalúa las condiciones inicial y final antes de entrar a ejecutar el lazo (y una sola vez), lo que implica que no se tienen en cuenta las variaciones que sufre el Last de la lista. Por lo tanto, el ciclo se realiza tantas veces como resulte de la diferencia entre la posición del Last y la posición del Cursor antes de entrar al lazo, o lo que es lo mismo las condiciones inicial y final no se reevalúan en cada iteración del lazo.
- Notar que en este caso particular no puede usarse el método ForEach para recorrer la lista, pues hay que buscar el primer elemento que cumpla una condición dada y a partir de este construir la nueva lista.
Ejercicio # 2 Implemente un TDA que representa a una lista de números reales que tiene, además de sus operaciones tradicionales, una que permite dividir la lista en dos sublistas, una con los elementos positivos y otra con los elementos negativos. R/ Uses List; type TRealList = class(TGeneralListSeq) protected Lpositivos, LNegativos : TRealList; procedure Accion(aItem: pointer); public function Dividir: boolean; end; procedure Accion(aItem: pointer); type PReal = ^Real; begin If PReal(aItem)^ > 0 then LPositivos.Insert(aItem) else LNegativos.Insert(aItem); end; Function TRealList.Dividir: boolean; begin Result := not Empty; if Result then begin LNegativos.Create; LPositivos.Create; ForEach(Accion); end; end; Estudio independiente Hacer un procedimiento de un programa que trabaja con datos sobre libros (código, título, precio) los cuáles están almacenados secuencialmente y ordenados por el precio; el procedimiento debe obtener en una nueva lista los datos de los libros cuyo precio sea mayor que uno dado como parámetro. |