computación ii 324-1-estructuras dinamicas-con enlaces
TRANSCRIPT
Computación II - 324
Computación II - 324
C
a
t
e
g
o
r
i
a
s
Bajo Nivel
Lenguaje máquina
Lenguaje Ensamblador
Computación II - 324
C
a
t
e
g
o
r
i
a
s
Alto Nivel
Cuarta Generación y Quinta Generación
Computación II - 324
Programación Estructurada
Para resolver problemas de cierta envergadura se
utiliza normalmente la técnica de diseño que se conoce
con el nombre de diseño modular.
El problema se divide en subproblemas que se puedan
resolver con un conjunto de subprogramas que tengan
una cierta cohesión.
Al conjunto de subprogramas que resuelve un
subproblema se le llama módulo funcional.
Un módulo puede hacer uso de un subprograma de otro
módulo si éste aparece en su interfaz
Computación II - 324
Programación Estructurada
Un interfaz es un conjunto de cabeceras de
subprogramas que pueden ser utilizados por otros
módulos.
Los interfaces aparecieron para minimizar el
acoplamiento entre los módulos. Se dice que es
conveniente un diseño con acoplamiento débil entre
módulos.
La interfaz sólo tienen que aparecer los subprogramas
principales del módulo y no los subprogramas que son
utilizados para implementar los subprogramas principales
Computación II - 324
Programación Estructurada
Esta descomposición se conoce con el nombre de
descomposición funcional.
Posteriormente aparece un nuevo tipo de
descomposición o abstracción que se conoce con el
nombre de abstracción de datos
Computación II - 324
Abstracción
La técnica de la abstracción no permite acceder
directamente a la representación de la estructura.
Computación II - 324
Abstracción
La abstracción: Separa la especificación (qué hace) de
la implementación (cómo lo hace). Los usuarios de un
TAD no necesitan conocer sus detalles de
implementación (Cómo lo hacen). Como consecuencia,
aporta las ventajas de:
Extensibilidad del código: Es posible modificar y
mejorar la implementación del TAD sin afectar a los
demás módulos que lo utilizan.,
b) Aumenta la facilidad de uso.
c) Aumenta la legibilidad del código que usa el TAD.
Manejo de memoria
5 caracteres
Computación II - 324
La asignación estática de memoria reserva la cantidad
necesaria para almacenar los datos de cada estructura en
tiempo de compilación
Tipo de datos en Pascal
5 caracteres
Computación II - 324
Tipo Rango Espacio en memoria
Char Carácter ASCII 1 byte
Byte 0 a 255 1 byte
Integer -32768 a 32767 2 bytes
Real 1 E -38 a 1 E+38 6 bytes
Boolean True – False 1 byte
Shortint -128 a 127 1 byte
Word 0 a 65535 2 byte
Longint -2147483648 a
214748364
4 byte
String Cadena de 255 caracteres Hasta 255 bytes
Manejo de memoria
5 caracteres
Computación II - 324
No se almacenan en memoria estática.
• Los objetos correspondientes a procedimientos o funciones
recursivas, ya que en tiempo de compilación no se sabe el
número de variables que serán necesarias.
• Las estructuras dinámicas de datos tales como listas,
árboles, etc. ya que el número de elementos que la forman no
es conocido hasta que el programa se ejecuta.
Computación II - 324
Uso de Procedimiento y funciones
Parámetros Valor
No devuelve valores…no antecede la palabra VAR
El compilador crea una copia del dato y lo almacena en
la variable parámetro que lo recibe. Dentro de la
función o procedimiento se trabaja con la copia
obtenida, no importando las operaciones que se
realicen con la copia, la variable introducida como
parámetro, no será afectada en su valor inicial al
terminar el proceso. Su sintaxis es la siguiente:
PROCEDURE Identificador (Ide1, Ide2: Tipo; Ide3: Tipo);
Computación II - 324
Ejemplo
program Ejemplo;
uses crt;
var nombre:string;
Procedure pasar(nombre1:string);
begin (* cambiando parametro *)
nombre1:='maria elena';
end;
BEGIN
clrscr; (* cargando variable *)
nombre:='juan fernando';
pasar(nombre);
(* desplegando *)
writeln('nombre : ',nombre);
readln;
END.
Valor de la variable nombre en el Procedimiento Pasar ?
Valor de la variable nombre en el Programa Principal?
Computación II - 324
Parámetro Por Referencia
Se reciben/envían con la palabra clave VAR.
Se trabaja en la misma posición de memoria de la
variable original, es decir, se referencian.
Cualquier cambio que se realice a la variable parámetro,
en el procedimiento o función también se le estará haciendo
a la variable original.
PROCEDURE Identificador (VAR Ide1: Tipo);
Computación II - 324
Ejemplo Ejemplo
program Ejemplo;
uses crt;
var nombre:string; edad:integer;
procedure pasar(nombre1:string;
var edad1:integer);
begin (* cambiando parametro *)
nombre1:='maria elena';
edad1:=50;
end;
BEGIN
clrscr; (* cargando variable *)
nombre:='juan fernando';
Edad:= 30;
(* mandando a procedimiento *)
pasar(nombre,edad);
(* desplegando *)
writeln('nombre : ',nombre);
writeln(‘edad : ',edad);
readln;
END.
Valor de la variables nombre y edad?
http://www.pcg.ull.es/edapplets/DataControlJApplet/pasoparametros.html
Computación II - 324
Punteros en Pascal.
Es una variable cuyo valor es una dirección de memoria donde se
encuentra la variable dinámica apuntada
sComputación II - 324
Punteros en Pascal.
En PASCAL los punteros se declaran con el símbolo ^.
Declarar las variables tipo puntero que sean necesarias
(Dentro de la sección VAR).
Computación II - 324
Se pueden definir tipos punteros o definir variables de tipo
puntero:
Type
ptr = ^integer;
Var
p: ptr;
q: ^real;
Ejemplo
p^:= 5 . Asigno el valor 5 a la variable apuntada por p.
writeln(p^). Imprime el valor de la variable apuntada por p.
sComputación II - 324
Creación y destrucción de variables dinámicas
El Procedimiento NEW(), asigna memoria a la variable puntero, en
caso de que el PC no obtenga memoria para alocar el pedido, al
puntero se le asignara la dirección NIL, cuyo significado es "nada", es
decir el puntero no apunta a ningún sector de la memoria.
El Procedimiento DISPOSE(), Libera memoria reservada por a la
variable puntero mediante el procedimiento DISPOSE()
Computación II - 324
Ejemplo.
New (puntero).
Asigna memoria a la variable apuntada por puntero.
Gráficamente.
Computación II - 324
Ejemplo.
Representación Gráfica.
Computación II - 324
Diagrama sintáctico. Tipo de dato
de dato
predefinido
en pascal
Tipo de dato
puntero.
Contiene una
dirección de
memoria
Computación II - 324
Ejemplo.
Dispose (puntero).
Libera la memoria asociada a la variable referida (la que contiene el dato).
Deja indefinido el puntero.
Gráficamente.
Computación II - 324
Ejemplo.
Type
Puntx=^Real;
Var
P:Puntx; <apunta a direcciones de memoria que contienen valores de tipo real.>
Estas declaraciones aún no crean nada en memoria hasta cuando el programa se ejecute el procedimiento NEW.
NEW(P) , genera lo siguiente en memoria.
P^
P--
Computación II - 324
Puntero.
NEW(P) , genera lo siguiente en memoria. Una celda vacía
apuntada por P y contendrá valor real.
P^
P--
P^:= 355 <asigna el valor 355 en la celda de memoria
apuntada por P^.
P--
355
Computación II - 324
TYPE
TApcar=^char;
VAR
Apcar:TApcar;
BEGIN
New(Apcar);
Readln(Apcar^);
Apcar^:= Pred(Apcar^);
END.
Computación II - 324
Operaciones con Puntero.
Las operaciones permitidas para esta nueva variables son:
Asignación
Lectura
Escritura
Todas las operaciones legales que se puedan realizar con dicho
tipo declarado (entero, string, char, etc).
Computación II - 324
Operaciones con Punteros (^).
Ejemplos.
Asignación:
Los cambios que se efectúen con la variable Apnum1 o la
Variable Apnum2 afectan a ambas, son indistintas.
El espacio en memoria que se reservo con la variable Apnum1
Sigue ocupado en memoria, lo conveniente es liberar este
Espacio antes de realizar la asignación.
Computación II - 324
TYPE
TApnum=^integer;
VAR
Apnum1,Apnum2:TApnum;
BEGIN
New(Apnum1);New(Apnum2); { inst. 1}
Apnum1^:=2;Apnum2^:=4; {inst. 2}
Apnum2^:=Apnum1^ + Apnum2^; {inst. 3}
Apnum1^:=Apnum2^ DIV 2 ; {inst. 4}
END.
Computación II - 324
New(Apnum1);New(Apnum2); { inst. 1}
Apnum1 Apnum2
Apnum1^:=2;Apnum2^:=4; {inst. 2}
Apnum1 Apnum2
2 4
Computación II - 324
6
Apnum2
Apnum1
3
Apnum2^:=Apnum1^ + Apnum2^; {inst. 3}
Apnum1^:=Apnum2^ DIV 2 ; {inst. 4}
Computación II - 324
Operaciones con Punteros (^).
Ejemplos.
Comparación:
Apnum1= Apnum2
La Comparación resulta con un valor TRUE, ya que Apnum1 y
Apnum2 contienen direcciones de memoria diferentes.
Computación II - 324
Operaciones con Punteros (^).
Ejemplos.
Asignación:
Apnum1: = Apnum2
Computación II - 324
Operaciones con Punteros (^).
• Comparación: Se comparan las direcciones, no los Contenidos de los datos apuntados o referenciados.
Apnum1=Apunum2 { Apnum1,Apnum2 son datos tipo ^}.
• Asignación: Se asignan las direcciones entre sí, no
el contenido de los datos apuntados.
Apnum1:= Apnum2 { Apnum1 y Apnum2 tienen la misma
dirección por lo tanto apuntan al mismo
dato.}.
Computación II - 324
Valor Nil .
Palabra reservada en el Lenguaje Pascal.
Es un valor que puede asignarse solo a las variables puntero
e indica que no están apuntando a ningún valor .
Nil puede ser utilizado por cualquier puntero, es decir,
independiente del tipo de dato referenciado (apuntado) por la
variable tipo puntero.
Ejemplo
Apnum1:= nil
Computación II - 324
Otras Estructuras de Datos…
Lineales: Listas enlazadas, Listas Doblemente enlazada, Pilas,
Colas.
No lineales: árboles , grafos.
Computación II - 324
Nodos.
Es una estructura creada por el programador, para poder
crear otras estructuras tales cómo Listas o Colas en memoria dinámica.
Un nodo posee un puntero que permite almacenar una dirección de otro nodo; es decir permite
enlazar múltiples nodos entre sí y hacer nuestras estructuras más complejas y alocarlas en memoria dinámica.
Computación II - 324
Nodo.
Ejemplo. Definición de un nodo.
TYPE TipoLista =^ TipoNodo; TipoNodo = Record Info:TipoInfo; Siguiente:TipoLista END;
Se declara un tipo de puntero llamado TipoLista que apunta a un registro TipoNodo.
Donde TipoNodo esta definido como un registro que almacenará información y un campo siguiente. Siguiente es un puntero a un tipo de dato TipoLista. Esta forma de definición recursiva nos permite construir los nodos.
Computación II - 324
Listas Enlazadas.
Es un conjunto de elementos llamados nodos en los que cada
uno de ellos contiene un dato y también la dirección del siguiente nodo. Cada nodo apunta al siguiente nodo, excepto el último nodo que apunta a NIL. Esto indica que cada nodo ocupa
posiciones no contiguas en memoria.
El orden de los mismos se establece mediante punteros.
Definición de estructura recursiva de nodos
Computación II - 324
Declaración de una estructura de nodos.
Computación II - 324
Una Lista enlazada requiere, como minímo de una
refrencia al primer nodo
Una lista vacía el primer nodo apunta a null
Operaciones básicas con listas
Crear Lista
Recorrer lista
Inserta un elemento (inicio-final-una posición dada)
Borrar un elemento
Búsqueda de un elemento
Característica de las listas
Estructura recursiva de nodos
<<En estas operaciones es fundamental el movimientos de los punteros>>
Computación II - 324
Para acceder al primer nodo de una lista es necesario el
uso de un puntero externo y posteriormente se continua
con siguiendo la cadena de puntero.
Operaciones con Listas enlazadas
(Puntero Externo)
Punteros enlazando al siguiente nodo Puntero del último nodo
apunta a nil
Computación II - 324
Cualquier operación con cualquier tipo de lista implica
redireccionar los punteros de los nodos involucrados o
afectados por la operación.
Operaciones Con listas enlazadas
Cualquier operación con cualquier tipo de lista implica
redireccionar los punteros de los nodos involucrados o
afectados por la operación.
Para la operación de inserción se debe determinar el
lugar dentro de la lista.
Operación Inserción un elemento en una lista
Esta operación consiste en agregar un nuevo nodo
a la lista. Se considerar tres casos:
Insertar un nodo al inicio.
Insertar un nodo antes o después de cierto nodo.
Insertar un nodo al final
Computación II - 324
Computación II - 324
Operación Inserción un elemento en una lista
Para la inserción es la creación de nodo, determinar el lugar dentro de
la lista y realizar el movientos de punteros requerido.
En el ejemplo anterior, observamos un nuevo nodo denominado tmp (al
que se asigna un valor x en el campo icorrespondiente a datos), el cual va
ser insertado en la posición posterior dada (apuntada por el nodo actual).
Observamos que para incluirlo en la lista, el apuntador siguiente de tmp,
lo movemos al la misma dirección que apunta el nodo actual y la posición
siguiente del nodo actual se mueve al nodo tmp.
Computación II - 324
Operación eliminar elemento en una lista
La operación consiste en eliminar un nodo de la
lista, redefiniendo las punteros que correspondan.
Se pueden presentar cuatro casos:
Eliminar el primer nodo.
Eliminar el último nodo
Eliminar un nodo con cierta información.
Eliminar el nodo anterior o posterior al nodo
cierta con información.
Computación II - 324
Operación eliminar elemento en una lista
Esta operación consiste en un simple cambio de una
referencia.
En el dibujo para eliminar el nodo con contenido x, hacemos que la referencia siguiente del nodo actual apunte
apunte al nodo b. Con eso queda alislado el nodo b.
Computación II - 324
Búsqueda de un elemento en una lista
Esta operación consiste en visitar cada uno de los
nodos, tomando al campo siguiente como puntero
al siguiente nodo a visitar.
Una lista enlazada con cabecera es una lista enlazada que
contiene un nodo especial, llamado nodo cabecera, al
principio de la lista.
Listas especiales con nodo cabecera
Computación II - 324
Listas especiales con nodo cabecera La eliminación del primer nodo se convierte en un caso
especial al igual que la inserción en la primera posición de la
lista, en este caso las operaciones se restringen a aquellas
posiciones posteriores a alguna otra.
La eliminación e insersición al comienzo de la lista son
algoritmos especiales y en todo caso engorroso
Computación II - 324
Búsqueda de un elemento en una lista
Esta operación consiste en visitar cada uno de los
nodos, tomando al campo siguiente como puntero
al siguiente nodo a visitar.
<<Análisis de ejercicio lista .pas>>
Computación II - 324
Listas Dobles
Es una colección de nodos, donde cada nodo tiene
dos punteros, uno de ellos apuntando a su
predecesor (li) y otro a su sucesor(ld).
Estructura de un nodo:
PI DATO PD
Computación II - 324
Tipos Listas Dobles
Listas dobles lineales.
En este tipo de lista doble, tanto el puntero
izquierdo del primer nodo como el derecho
del último nodo apuntan a NIL.
Se puede recorrer una serie de nodos donde
desde cualquier nodo excepto el último y el
primero. Se puede viajar al nodo anterior o al
siguiente utilizando dos punteros llamados
P_prox y P_ant.
Computación II - 324
Tipos Listas Dobles
Listas dobles circulares.
En este tipo el puntero izquierdo del primer nodo
apunta al último nodo de la lista, y el puntero
derecho del último nodo apunta al primer nodo de
la lista.
Computación II - 324
Pilas.
Tipo especial de lista lineal en la cual un elemento sólo puede ser
añadido o eliminado por un extremo llamado cima.
Esto significa que los elementos se sacan de la pila en orden
inverso al que se pusieron en ella.
LIFO (LAST IN- FIRST OUT). Primero que entra último que sale.
Pila: caso particular de una lista enlazada
La imagen muestra como quedaría una pila de enteros al agregarle un
valor 3, luego un 2 y luego un 1.
Computación II - 324
<<Analizar ejercicio de pila>>
Computación II - 324
Colas
Una cola es una lista en las que las supresiones se realizan
solamente solamente al principio de la lista y las inserciones al final
de la misma.
Son conocidas como listas FIFO (First In, First Out: El primero en
entrar es el primero en salir). Los elementos se almacenan en
fila, pero sólo pueden añadirse por un extremo y leerse por el
otro.
Analizar ejercicio de cola
Cola
Computación II - 324
Computación II - 324
Recursividad
Es una herramienta de programación utilizada para resolver
problemas que al subdividirlos en subproblemas presentan la
misma estructura.
Casos Típicos definir objetos en sí mismo ejemplo árboles, colas,
listas, listas enlazadas.
Un programa que se llame a sí mismo se dice que es recursivo
Computación II - 324
Tipos de Recursividad
Directa e indirecta
Diseño de la Recursividad
Estado básico: Es el estado en el cual la solución no se presenta
de manera recursiva sino directamente.
Estado General: Se debe poder resolverse en función del caso
base y un caso general de menor tamaño (que progrese hacia una
solución más sencilla, hacia el caso base)
Computación II - 324
Desventajas de la Recursividad
No es más rápida que la iteración (ya que implica guardar entornos).
Consume muchos recursos (memoria)
Funcionamiento de la Recursividad
Es necesario guardar el estado de cada programa antes de cada
llamada (variables locales, parámetros y punto de ejecución) para que
sepa seguir después de la llamada.
Computación II - 324
Análisis del cálculo del factorial de un número program factorial;
uses crt;
var
n,i,mul:integer;
begin
mul:=1;
i:=1;
writeln (‘Numero a sacarle el factorial');
readln (n);
repeat
mul:=mul*i;
i:=i+1;
until (i>n);
writeln ('el factorial es ',mul);
readln;
end.
program FactorialNum;
var
num:integer;
function factorial(n:integer):integer;
begin
if (n > 1) then
factorial:= n * factorial(n-1)
else factorial:=1;
end;
begin
write(' Ingrese el valor de n: ');
readln(num);
writeln(' El resultado es: ',factorial(num));
readln;
end.
Realice la corrida de cada uno