5. Objetivo
Avanzar en el aprendizaje de la programación :
Recursión
Estructuras Dinámicas (punteros)
Tipos Abstractos de Datos
Módulos
Técnicas de ensayo de programas
6. Temario
Tipos abstractos de datos.
Diseño de programas, módulos de programa.
Implementación de módulos en lenguaje C/C++.
Algoritmos de búsqueda y ordenación.
Introducción al análisis de algoritmos:
eficiencia en tiempo de ejecución y espacio de
almacenamiento.
Concepto de recurrencia.
Implementación de tipos de datos recurrentes:
concepto y manipulación de punteros. (ej:
Implementación de listas).
7. Temario
Implementación de funciones recurrentes.
Diseño de programas mediante abstracción de datos.
Refinamiento de funciones y datos.
Abstracciones de datos básicas:
Estructuras lineales (listas, pilas, colas, dobles-
colas).
Árboles (árboles binarios de búsqueda, árboles
generales, estructuras arborescentes).
8. Bibliografía
Estructuras de datos y algoritmos
Wirth, N. Algoritmos y Estructuras de Datos. Prentice-Hall.
1987.
Weiss, M. A. Estructuras de Datos y Algoritmos. Addison-
Wesley Iberoamericana. 1995.
Aho, A. V., J. E. Hopcroft y J. D. Ullman. Estructuras de
Datos y Algoritmos. Addison-Wesley Iberoamericana.
1988.
Lenguaje de programación C/C++
Kernighan, B. W. y D. M. Ritchie. El lenguaje de
programación C. Prentice-Hall. 1991.
Deitel, H. M. y P. J. Deitel. Cómo programar en C/C++.
Prentice-Hall. 1998.
10. Estrategia
Clarificar el concepto "programa de computadora"
Lenguaje de programación (C/C++)
Tipos de Datos (int,float,char)
Registros
Uniones
Estructuras Dinámicas(Punteros)
Módulos
Compilación separada
11. Estrategia
Estudiar cómo construir programas que resuelvan
problemas dados.
Metodología de Programación
Recurrencia
Listas y Árboles
Tipos Abstractos de Datos
Ensayo de Programas
12. Autómatas Maquinas de estado
Los lógicos (matemáticos) en la década del '30 buscaron "modelos universales"
de programas.
En cada momento, la máquina está en un cierto estado
El conjunto de estados se especifica precisamente
Hay un conjunto de acciones (transiciones) que son las formas de operar la
máquina. Las transiciones cambian el estado de la máquina
Ejemplos:
Cisterna
Componentes:
tanque (conteniendo cierta cantidad de agua)
llave de paso (abierta/cerrada)
(ver analogía con variables Pascal)
Estados:
combinaciones de los estados del par de componentes (tanque, llave de paso)
Acciones:
tirar la cisterna
...
13. Autómatas Maquinas de estado
Otro ejemplo:
Calcular el máximo de dos números
Componentes: int x, y, max;
Transición:
if (x >= y) max = x; else max = y ;
Efecto
dado un estado inicial, la transición cambia ese estado de tal
modo que en el estado final la variable max contiene el
máximo de x e y
Efecto del programa
consiste en el cambio de estado
14. Maquinas de estado programables
Los ejemplos vistos son programas individuales
¿ Cómo sería una máquina programable capaz de
ejecutar CUALQUIER PROGRAMA ?
Noción universal de Programa
(Programa para la máquina universal)
Idea:
Programa + indicador de hasta dónde se ha ejecutado
Esto forma parte del estado (están almacenados en la
máquina)
15. Maquinas de estado programables
Esquema:
Componentes:
Memoria
Lista de casillas identificadas
Cada casilla puede contener un símbolo, de una lista
dada.
Las casillas se usan para almacenar:
instrucciones
datos
Punto de control - “program counter"
Señala al lugar de memoria donde se
encuentra la siguiente instrucción a ejecutar
16. Maquinas de estado programables
Instrucciones:
hay un conjunto de instrucciones precisamente especificado
En general, cada instrucción modifica el estado de la máquina
Máquina de Turing
1936 - Modelo de "procedimiento computable"
¿ Es decidible mecánicamente si un enunciado matemático
es verdadero o
falso ?
17. Maquinas de estado programables
Computadora Electrónica
Realización del modelo de Turing (~1945)
Las celdas pueden contener sólo 0 ó 1 (Bits)
Instrucciones y datos codificados en secuencias de bits
(código binario)
¡ La noción abstracta de PROGRAMA antecedió a las
computadoras electrónicas!
(Más aún: constituyó la base de su diseño)
Resultados inesperados de investigaciones altamente
teóricas
18. Maquinas de estado programables
Lenguajes de Programación de Computadoras
Lenguaje de Máquina
Las instrucciones son secuencias de bits:
1100111011...1 que se interpretan.
El conjunto de instrucciones y el formato esta dado por la
arquitectura de la maquina (add, mov,…).
Ejemplo:
-1100 (significa sumar)
-111011...1 (operandos)
19. Programa de Computadora
Programas
Difícil de definir, podríamos decir que:
instrucciones que la CPU de una computadora puede
entender y ejecutar.
Conjunto de pasos para resolver un problema dado.
Buscamos
acordar una noción (más) objetiva de programa
Acordar reglas para escribir programas
notación, sintaxis
significado, semántica
20. Abstracción
Metodologías de Programación
Partición
Refinamiento
Sinónimo de problema: ESPECIFICACION.
El problema especifica qué debe satisfacer el programa buscado, el
conjunto de programas aceptables
Partición
Descomponer la especificación inicial en subproblemas
Verificar que la estructura obtenida resuelve el problema, asumiendo
que los componentes están resueltos correctamente.
Refinamiento
Proceder de la misma forma con los componentes Aún no
implementados
21. Abstracción
Queremos los programas de computadora para
resolver problemas
En el enunciado de los problemas se manejan
conceptos "abstractos"
Ej: número entero, matriz de reales, cliente
Construir programas para resolver problemas dados
involucra representar conceptos abstractos en
términos del lenguaje de programación
Complejidad de la Programación
inherente a los problemas
proceso de construcción de los programas
22. Abstracción
El proceso sigue refinando conceptos "abstractos"
hasta alcanzar el nivel del lenguaje de máquina.
Ciertas clases de estos refinamientos pueden
realizarse Automáticamente.
Entonces es posible definir lenguajes de
programación más abstractos
Lenguajes de alto nivel (de abstracción) donde son
primitivos ciertos conceptos abstractos.
Hay un programa (compilador) que produce
representaciones de esos conceptos.
23. Paradigmas de Programación
Lenguajes de Programación
Existen docenas de lenguajes de programación, y se sigue
creando nuevos.
Cada uno tiene sus propias preferencias en cuanto al estilo
de programación
24. Paradigmas de Programación
Cualidades de un Lenguaje
Expresividad (que el numero máximo de problemas se
puedan expresar con este lenguaje)
Facilidad del aprendizaje
Portabilidad (que pueda compilar en maquinas de bajo costo,
en diferentes SO)
Cualidad de la implementación
Factores económicos
Tipo y cantidad de paradigmas que soporta.
25. Paradigmas de Programación
Programación Imperativa
Es el paradigma que surgió mas naturalmente al desarrollo de
las computadoras : las maquinas están físicamente
construidas para ejecutar series de instrucciones maquinas
Se concibieron abstracciones de esas instrucciones o
combinaciones de ellas para dar lugar a lenguajes de mas
alto nivel. La idea central es el estado del programa que va
cambiando por las operaciones que se ejecutan.
26. Paradigmas de Programación
Programación Procedural
Para cumplir una tarea dada, descomponemos todo en sub-
tareas de calculo que se cumplen sucesivamente para
alcanzar la meta (procedimientos, funciones).
Mas modularidad, permite mejor re-utilización del código.
Ejemplo: C, Basic...
27. Paradigmas de Programación
Programación Funcional
En la programación funcional, como lo indica su nombre, la
entidad básica es la función. Se intenta evitar referencias a
variables.
Ejemplos de Lenguajes : Lisp, Haskell, ...
Utilizado en IA.
28. Paradigmas de Programación
Programación Lógica
En este paradigma, se consideran principalmente predicados
y reglas lógicas que alimentan una base de conocimientos.
Ejecutar un programa, en este caso, es evaluar o un
predicado o dar valores para que un predicado es verdadero.
29. Paradigmas de Programación
Programación Orientada a Objetos
La Programación Orientada a Objetos (POO , OOP) es un
paradigma de programación que usa objetos y sus interacciones
para diseñar aplicaciones y programas de computadora. Está
basado en varias técnicas, incluyendo herencia, modularidad,
polimorfismo y encapsulamiento
30. Lenguajes de Programación
En lenguaje de programación se puede clasificar
también según la forma de ejecución de los
programas escritos en el.
Interpretado
Compilado
31. Lenguajes de Programación
En un lenguaje interpretado, el código es convertido
en instrucciones ejecutables por el microprocesador al
momento mismo de la ejecución. Necesita un
programa interprete. La CPU ejecuta las instrucciones
del interprete.
Ejemplos : Python, JavaScript, prolog, Java,…
En un lenguaje compilado, el código es traducido en
instrucciones ejecutables una vez por todas.
Ejemplos : C( pero existen también versiones
interpretadas),Pascal, Modula-2,….
32. Compilación
Compilador
Programa informático que traduce un programa escrito en un
lenguaje de programación a otro lenguaje de programación,
generando un programa equivalente que la máquina será
capaz de interpretar. Usualmente el segundo lenguaje es
código máquina, pero también puede ser simplemente texto.
Este proceso de traducción se conoce como compilación.
33. Compilación
Permite traducir el código fuente de un programa en lenguaje
de alto nivel, a otro lenguaje de nivel inferior (típicamente
lenguaje máquina).
El programador puede diseñar un programa en un lenguaje
mucho más cercano a como piensa un ser humano, para
luego compilarlo a un programa más manejable por una
computadora.
34. Compilación
Principio de compilación separada:
A menudo, los programas usan componentes que son
construidos en forma totalmente independiente
Ej: funciones de biblioteca
Si cambiamos la implementación de una función de
biblioteca, no queremos tener que recompilar todos los
programas que usan esa función
El programa y (ciertos) componentes auxiliares son
compilables separadamente
36. Compilación en C/C++
-El preprocesador, trabaja con el código fuente y lo
preprocesa.(Está fase esta presente en el lenguaje
C/C++ y no en todos los lenguajes)
-El compilador transforma el código fuente y genera
código ensamblador (Assembly).
-El ensamblador convierte el código assembler en
lenguaje de maquina obteniendo un archivo objeto
(.o)
-El linker combina varios archivos objeto para
generar el ejecutable.