El documento describe diferentes conceptos relacionados con la computación, incluyendo niveles de lenguajes de programación, programación estructurada, abstracción de datos, manejo de memoria, tipos de datos, punteros, y estructuras de datos como listas enlazadas. Explica conceptos clave como la diferencia entre parámetros por valor y referencia, y cómo usar punteros para crear y manipular datos dinámicos en memoria, como nodos y listas enlazadas.
Fundamentos de Analisi y Diseño de Algoritmos FADAJose Luis Dorao
Pproblema de redes de amistad “Friendship Networks” se refiere a la manera de verificar si una red de amigos está bien construida de tal manera que el primer número de la cadena de enteros diga la cantidad de redes de amistad bien construidas suponiendo que la persona no se podrá ser amigo de sí misma.
Fundamentos de Analisi y Diseño de Algoritmos FADAJose Luis Dorao
Pproblema de redes de amistad “Friendship Networks” se refiere a la manera de verificar si una red de amigos está bien construida de tal manera que el primer número de la cadena de enteros diga la cantidad de redes de amistad bien construidas suponiendo que la persona no se podrá ser amigo de sí misma.
Trabajo practico de la asignatura Investigación de Operaciones II (348)
Perteneciente al pensum de Ingeniería de Sistemas, Universidad Nacional Abierta, 2014 -2
2. Computación II - 324
C Lenguaje máquina
a
t
e
Lenguaje Ensamblador
g Bajo Nivel
o
r
i
a
s
3. Computación II - 324
C
a
t
e Alto Nivel
g
o
r
i
a
s Cuarta Generación y Quinta Generación
4. 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
5. 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
6. 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
7. Computación II - 324
Abstracción
La técnica de la abstracción no permite acceder
directamente a la representación de la estructura.
8. 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.
9. Computación II - 324
Manejo de memoria
5 caracteres
La asignación estática de memoria reserva la cantidad
necesaria para almacenar los datos de cada estructura en
tiempo de compilación
10. Computación II - 324
Tipo de datos en Pascal
Tipo Rango Espacio en memoria
Char Carácter ASCII 1 byte
5Byte
caracteres
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 4 byte
214748364
String Cadena de 255 caracteres Hasta 255 bytes
11. Computación II - 324
Manejo de memoria
No se almacenan en memoria estática.
5• caracteres
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.
12. 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);
13. Computación II - 324
Ejemplo
program Ejemplo;
uses crt; BEGIN
var nombre:string; clrscr; (* cargando variable *)
nombre:='juan fernando';
Procedure pasar(nombre1:string); pasar(nombre);
(* desplegando *)
writeln('nombre : ',nombre);
begin (* cambiando parametro *) readln;
END.
nombre1:='maria elena';
end;
Valor de la variable nombre en el Procedimiento Pasar ?
Valor de la variable nombre en el Programa Principal?
14. 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);
15. Computación II - 324
Ejemplo
BEGIN
program Ejemplo; clrscr; (* cargando variable *)
nombre:='juan fernando';
uses crt;
Edad:= 30;
var nombre:string; edad:integer; (* mandando a procedimiento *)
procedure pasar(nombre1:string; pasar(nombre,edad);
(* desplegando *)
var edad1:integer);
writeln('nombre : ',nombre);
begin (* cambiando parametro *) writeln(‘edad : ',edad);
nombre1:='maria elena'; readln;
END.
edad1:=50;
end;
Valor de la variables nombre y edad?
http://www.pcg.ull.es/edapplets/DataControlJApplet/pasoparametros.html
16. 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
17. 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).
18. 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.
19. 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()
20. Computación II - 324
Ejemplo.
New (puntero).
Asigna memoria a la variable apuntada por puntero.
Gráficamente.
22. Computación II - 324
Tipo de dato Tipo de dato
Diagrama sintáctico. puntero. de dato
Contiene una predefinido
dirección de en pascal
memoria
23. 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.
24. 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--
25. 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^.
355
P--
26. Computación II - 324
TYPE
TApcar=^char;
VAR
Apcar:TApcar;
BEGIN
New(Apcar);
Readln(Apcar^);
Apcar^:= Pred(Apcar^);
END.
27. 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).
28. 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.
29. 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.
31. Computación II - 324
Apnum2^:=Apnum1^ + Apnum2^; {inst. 3}
6
Apnum2
Apnum1^:=Apnum2^ DIV 2 ; {inst. 4}
3
Apnum1
32. 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.
33. Computación II - 324
Operaciones con Punteros (^).
Ejemplos.
Asignación:
Apnum1: = Apnum2
34. 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.}.
35. 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
36. Computación II - 324
Otras Estructuras de Datos…
Lineales: Listas enlazadas, Listas Doblemente enlazada, Pilas,
Colas.
No lineales: árboles , grafos.
37. 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.
38. 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.
39. 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.
40. Computación II - 324
Declaración de una estructura de nodos.
Definición de estructura recursiva de nodos
41. Computación II - 324
Característica de las listas
Una Lista enlazada requiere, como minímo de una
refrencia al primer nodo
Una lista vacía el primer nodo apunta a null
Estructura recursiva de nodos
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
<<En estas operaciones es fundamental el movimientos de los punteros>>
42. Computación II - 324
Operaciones con Listas enlazadas
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.
(Puntero Externo)
Punteros enlazando al siguiente nodo Puntero del último nodo
apunta a nil
43. Computación II - 324
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.
44. Computación II - 324
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
45. 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.
46. 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.
47. 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.
48. 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.
Listas especiales con nodo cabecera
Una lista enlazada con cabecera es una lista enlazada que
contiene un nodo especial, llamado nodo cabecera, al
principio de la lista.
49. 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
50. 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>>
51. 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
52. 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.
53. 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.
54. 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.
55. Computación II - 324
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.
<<Analizar ejercicio de pila>>
56. 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
58. 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
59. 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)
60. 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.
61. Computación II - 324
Análisis del cálculo del factorial de un número
program factorial; program FactorialNum;
uses crt; var
num:integer;
var function factorial(n:integer):integer;
n,i,mul:integer; begin
if (n > 1) then
begin factorial:= n * factorial(n-1)
mul:=1; else factorial:=1;
i:=1; end;
begin
writeln (‘Numero a sacarle el factorial'); write(' Ingrese el valor de n: ');
readln (n); readln(num);
writeln(' El resultado es:
repeat ',factorial(num));
readln;
mul:=mul*i; end.
i:=i+1;
until (i>n);
writeln ('el factorial es ',mul);
Realice la corrida de cada uno
readln;
end.