TEMA 2 Resolución de Problemas y Descripción de Algoritmos Elementos de Programación I Contenido del Tema TT EE M M A A 22 2.1. Problemas y Algoritmos 2.2. Calculabilidad ¿Qué se quiere hacer? ¿Qué se puede hacer? 2.3. Elementos Metodológicos. ¿Cómo hay que hacerlo? 2.4. Introducción a Lenguajes de Programación 2.5. Paradigmas de Programación 2.6. Reconocimiento de Lenguajes 2.7. Introducción al Pseudolenguaje Elementos de Programación I TT EE M M A A 2.1. Problemas y Algoritmos ¿Qué se quiere hacer? 22 Elementos de Programación I Problemas y Algoritmos Ordenador: - Operaciones simples (suma y comparación). - Gran velocidad de ejecución de estas. Tarea Realizada por un ordenador Descripción en términos de esas operaciones ? Algoritmo Mohammed al-Khowârizmî Primitivas, Procesador, Entorno Elementos de Programación I 4 Problemas y Algoritmos Supongamos que tenemos un robot que funciona como criado del hogar y queremos enseñarle a preparar un café instantáneo. El algoritmo podría ser el siguiente: (1) Hervir agua (2) Poner café en una taza (3) Echar el agua en la taza Sin embargo, nuestro robot puede no ser capaz de interpretar una instrucción como Hervir agua y es posible que tengamos que explicarle como hacerlo: (1) Hervir agua (1.1) Llenar un cazo con agua (1.2) Ponerlo en la hornilla (1.3) Encender el fuego (1.4) Esperar hasta que hierva (1.5) Apagar el fuego Elementos de Programación I 5 Problemas y Algoritmos • Procesador. Entidad capaz de entender un enunciado y ejecutar el trabajo descrito. • Entorno. Conjunto de condiciones necesarias para la ejecución del trabajo. • Acción o Primitiva. Cada etapa del enunciado. • Secuencialidad. Cada acción se ejecuta cuando la anterior ha terminado completamente. • Paralelismo. Existen algoritmos en los cuales algunas (o todas) las primitivas se pueden ejecutar a la vez. Se dice entonces que se trata de un algoritmo paralelo. Elementos de Programación I 6 Problemas y Algoritmos • Dado un procesador bien definido y un trabajo a ejecutar por este procesador, un algoritmo es el enunciado de una secuencia de acciones primitivas que realizan ese trabajo. • Hay que considerar 3 aspectos: - Primitivas de las que partimos. - Lenguaje simbólico a utilizar. - Representación de los datos. Elementos de Programación I 7 Problemas y Algoritmos • Ejemplo: Producto de 2 números naturales X e Y. • 1) Mediante un ábaco. - Primitiva: saber contar. - Abaco de 3 filas de bolas de distinto color. - Representamos un dato con bolas a la izquierda. - Inicialmente a la izquierda no hay bolas. Elementos de Programación I 8 Problemas y Algoritmos a) Desplazar X bolas rojas a la izquierda. b) Desplazar Y bolas azules a la izquierda. mientras haya bolas azules a la izquierda c) Desplazar X bolas blancas a la izquierda. d) Desplazar 1 bola azul a la derecha. fin_mientras e) Contar las bolas blancas a la izquierda. f) Parar Elementos de Programación I 9 Problemas y Algoritmos • 2) Mediante hojas de papel. - Primitiva: saber sumar y restar. - Representación de los datos mediante cifras. - Proceso sobre 3 hojas de papel. Elementos de Programación I 10 Problemas y Algoritmos a) Escribir X sobre la hoja 1. b) Escribir Y sobre la hoja 2. c) Escribir 0 sobre la hoja 3. repetir d) Sumar los valores de las hojas 1 y 3 y escribir el resultado en la hoja 3, perdiéndose el valor anterior. e) Restar 1 al valor escrito en la hoja 2 y escribir el resultado en la misma hoja, perdiéndose el anterior. hasta que el valor de la hoja 2 sea 0. f) Leer el valor escrito en la hoja 3. g) Parar. Elementos de Programación I 11 Problemas y Algoritmos • Estructura general de un algoritmo datos de entrada resultados Proceso ALGORITMO Elementos de Programación I 12 Problemas y Algoritmos • • • • Acciones de Entrada: Recogen los datos para el trabajo. Acciones de Proceso: Ejecutan los cálculos. Acciones de Salida: Ofrecen los resultados. Datos: - De entrada. - De salida. - Internos (resultados intermedios) • Interfaz: Acciones de Entrada + Acciones de Salida + Datos de Entrada + Datos de Salida Elementos de Programación I 13 Problemas y Algoritmos Resolución de problemas: 1. Análisis del problema. 2. Diseño o desarrollo del algoritmo. 3. Resolución del algoritmo en la computadora. Elementos de Programación I 14 TT EE M M A A 2.2. Calculabilidad ¿Qué se puede hacer? 22 Elementos de Programación I Calculabilidad 2.2.1. Introducción. • Sistema formal de Hilbert • Teorema de incompletitud de Gödel • Otros problemas no computables: Church, Kleene, Post y Turing. Elementos de Programación I 16 Calculabilidad 2.2.2. El problema de la detención. Ejemplo de un algoritmo que no se detiene: a) Leer un valor de teclado e introducirlo en la variable x b) Repetir c) Restar 1 al valor de x d) Hasta que el valor de x sea igual a 0. Elementos de Programación I 17 Calculabilidad P D Detención( , ) ¿Se detiene P(D)? SI Dar Salida “BIEN” y detenerse NO Dar Salida “MAL” y detenerse Elementos de Programación I 18 Calculabilidad P Nueva_Detención( ) ¿Se detiene P(P)? SI Dar Salida “BIEN” y detenerse NO Dar Salida “MAL” y detenerse Nueva_Detención(P) = Detención(P,P) Elementos de Programación I 19 Calculabilidad Algoritmo SIMPATICO(P) si NUEVA_DETENCION(P) da "MAL" entonces Detenerse en otro caso Ciclo interminable Elementos de Programación I 20 Calculabilidad P SIMPATICO( ) ¿Se detiene P(P)? SI NO Detenerse Ciclo Interminable Elementos de Programación I 21 Calculabilidad SIMPATICO SIMPATICO( ) ¿Se detiene P(P)? SI NO Detenerse Ciclo Interminable Elementos de Programación I 22 Calculabilidad Elementos de Programación I 23 Calculabilidad 2.2.3. La Máquina de Turing. • Modelo matemático formal del concepto de algoritmo. • Consta de: – Cinta infinita – Cabeza de Lectura/Escritura Elementos de Programación I 24 Calculabilidad • M. de T.=(? , Q, q0, ?) - ? es un conjunto de símbolos que contiene a SP (espacio en blanco). - Q es el conjunto de estados. - q0 ? Q, es el estado inicial. - ? es la función de transición: ??? ?x Q --> (? x {I,D} x Q) U {FIN, ERROR} • Computacion: pares (cinta, estado) Elementos de Programación I 25 Calculabilidad Cinta infinita Cabeza lectura/escritura Elementos de Programación I 26 Calculabilidad • Máquina de Turing para sumar dos números naturales. – Inicialmente, la cabeza lectura/escritura está entre los números a sumar. Por ejemplo, para 2+1: | | * | * Cinta infinita Cabeza lectura/escritura Elementos de Programación I 27 Calculabilidad • La Máquina de Turing quedará: ? = {SP, |, *} Q = {q0, q1, q2, q3} q0 estado inicial Elementos de Programación I 28 Calculabilidad SP / SP,I ?: SP / SP,D | / SP,D q0 q1 * * / *, D FIN | / |,I * / *,I q3 q2 | / |, D SP / |,I Elementos de Programación I 29 Calculabilidad • Tesis de Church- Turing • Maquina de Turing Universal Cinta Entrada Cinta Salida Máquina M Cinta Entrada y Representación de M Cinta Salida Máquina Universal Elementos de Programación I 30 TT EE M M A A 2.3. Elementos Metodológicos. ¿Cómo hay que hacerlo? 22 Elementos de Programación I Elementos Metodológicos 2.3.1. La Crisis del Software. • Problemas al prescindir de metodología: – Rigidez e inflexibilidad de los programas (TRUCOS). – Pérdida excesiva de tiempo en corrección de errores (PARCHES). – Documentación deficiente e insuficiente, incluso nula. – Imposibilidad de reutilizar el programa o fragmentos suyos en proyectos futuros. Elementos de Programación I 32 Elementos Metodológicos Pruebas 15% Codificación 7% Diseño 5% Mantenimiento 67% Requerimientos 3% Especificación 3% Coste relativo de las etapas del desarrollo software Elementos de Programación I 33 Elementos Metodológicos Problema: Programar es un “ARTE”. Crisis del Software Programador Solución: METODOLOGIAS. Ingeniería del Software Ingeniero Software Elementos de Programación I 34 Elementos Metodológicos 2.3.2. Objetivos Básicos. • • • • Exactitud: Corrección o Fiabilidad: Ausencia de errores. Verificación Solidez o robustez: Legibilidad: Fácil de entender. - Documentación - Comentarios. - Sangrado. - Nombres significativos de las variables Elementos de Programación I 35 Elementos Metodológicos • • • • • Flexibilidad: Fácil modificación. Transportabilidad: Independencia de la máquina. Reusabilidad: Posibilidad de reutilización. Eficiencia: Rápidez y utilización de pocos recursos. Sencillez: Fácil de usar (“friendly”). Elementos de Programación I 36 Elementos Metodológicos 2.3.3. Ciclo de vida clásico del Software. DEFINICION DESARROLLO Fallos de definición MANTENIMIENTO Errores Modificaciones y adaptaciones Elementos de Programación I 37 Elementos Metodológicos 2.3.4. Metodología de Diseño. • Proceso de diseño de algoritmos: – Resolución • ANALISIS: Descubrir la estructura del problema. • SINTESIS: Creación y construcción de una solución. – Implementación • REPRESENTACION de la solución. • REVISION de los resultados. Elementos de Programación I 38 Elementos Metodológicos • Dos estrategias de diseño muy comunes en programación: – Resolución por analogía. – Partición. "Divide y vencerás". Elementos de Programación I 39 Elementos Metodológicos • Diseño por analogía: Utilizar una solución similar a la de un problema parecido. – Fases: 1. Estudio del problema. 2. Búsqueda de problema similar ya resuelto. 3. Identificación de diferencias. 4. Cambios en la solución. – Ventajas: Técnica rápida y sencilla. – Inconvenientes: Riesgo de que los problemas no sean tan parecidos. Elementos de Programación I 40 Elementos Metodológicos • Diseño descendente. "Refinamientos sucesivos" o "programación modular". “Divide y vencerás”. – Fases: 1. Estudio del problema. 2. Descomposición en subproblemas más sencillos y lo más independientes posible. 3. Repetir el paso 2 para cada subproblema hasta que la solución de los mismos sea trivial. 4. Implementar las soluciones. 5. Reconstruir la solución global desandando el camino. Elementos de Programación I 41 Elementos Metodológicos – Características: • Diseño de lo general (abstracto) a lo particular. • Las decisiones complejas se posponen. • Estructura jerárquica de niveles. En cada nivel se encuentra el problema (o solución) completo. • En el nivel superior se encuentra la definición del problema y el nivel inferior la solución completa. – Ventajas: • Legibilidad • Reusabilidad. • Modificabilidad. Elementos de Programación I 42 Nivel Abstracto (descripción funcional del problema) Nivel 0 Nivel 1 Nivel 2 Nivel 3 Nivel Particular (código en L. P.) Score TETRIS Level 2 3455 Next Teclas Pulsadas Módulos Nivel 0 TETRIS Nivel 1 iniciar_partida generar_figura bajar_figura chequear_lineas terminar_partida Nivel 2 selccionar_ nivel dibujar_ marco borrar_ linea generar_ NEXT borrar_ figura pintar_ figura leer_ tecla bajar_ lineas Introducción a los Lenguajes de Programación Recapitulación de Conceptos Algoritmo ? Proceso de Cómputo Programa ? Descripción de un Algoritmo Lenguaje de Programación ? ?Notación para confeccionar Programas Elementos de Programación I 46 Fortran I A lgol 58 F l o w - M atic Fortran II C O M T R A N L I S P C obol A lgol 60 Fortran IV A P L C P L S im u l a I B A S I C PL/I A lgol-W IS W IN S im u l a - 6 7 A lgol-68 B C L P B Pascal C Pascal Concurrente S c h e m e M esa C S P Prolog Fortran 77 D P M L F lavors A D A M odula-2 Smalltalk Objective-C C lascal Fortran 8x Object-Pascal H o p e C + + C o m m o n - L I S P New Flavors M iran d a O b e r o n M odula-3 Eiffel Standard-M L C lean Haskell D elphi Java Elementos de Programación I Fortran I A lgol 58 Flow-Matic Fortran II C O M T R A N L I S P C o b o l A lgol 60 Fortran IV A P L C P L S im u l a I B A S I C PL/I Algol-W ISW IN S im u l a - 6 7 Algol-68 B C L P B Pascal C Pascal Concurrente S c h e m e M esa C S P Prolog Fortran 77 D P M L F lavors A D A Modula-2 Smalltalk Objective-C C lascal Fortran 8x Object-Pasca l H o p e C + + C o m m o n - L I S P New Flavors M iranda O b e r o n Modula-3 Eiffel Standard-M L Clean Haskell D elphi Java Elementos de Programación I Historia de los Lenguajes de Programación Antecedentes Históricos (30s-40s) • Cálculo de Programas de Zuse (Plankalkül) • Máquina de Turing • Diagramas de Flujo de Von Neumann • Lambda-Cálculo de Church Elementos de Programación I 49 Historia de los Lenguajes de Programación • • • • • • • FORTRAN COBOL LISP ALGOL-60, -68 SIMULA-67 PASCAL C • • • • MODULA-2 C++ Delphi Java Elementos de Programación I 50 Clasificación de los Lenguajes de Programación • Es posible clasificar los lenguajes de programación siguiendo diferentes criterios. • Se considerarán dos: – Finalidad del lenguaje – Características del lenguaje Elementos de Programación I 51 Clasificación de los Lenguajes de Programación • Según la finalidad, existen lenguajes: – – – – – – Científicos: ALGOL, FORTRAN, ... Ingenieriles: ADA, DYNAMO, ... de Gestión: COBOL, dBASE, ... de Inteligencia Artificial: LISP, PROLOG, ... Multipropósito: PASCAL, MODULA-2, C, ... ... Elementos de Programación I 52 Clasificación de los Lenguajes de Programación Clasificación de los lenguajes de programación según sus características Paradigmas de Programación Elementos de Programación I 53 Paradigmas de Programación • Un paradigma de programación es un modelo que engloba a ciertos lenguajes que comparten: – Elementos estructurales: ¿con qué se confeccionan los programas? – Elementos metodológicos: ¿cómo se confecciona un programa? Elementos de Programación I 54 Paradigmas de Programación • Consideramos los siguientes paradigmas: Orientado a Objetos Funcional Imperativo Declarativo Lógico • Los paradigmas no son disjuntos. Elementos de Programación I 55 Paradigmas de Programación Programación Imperativa • Es la más antigua máquina de Von Neumann • Un programa es una secuencia de acciones que se realizan en orden. • Existen herramientas para modificar el orden de ejecución de las acciones. Elementos de Programación I 56 Paradigmas de Programación • Diagramas de Flujo: Comienzo y terminacion del algoritmo Operación de Entrada/Salida Flujo Acción primitiva Bifurcación Elementos de Programación I 57 Paradigmas de Programación • Ejemplo: Inicio s := s + 1 leer (n) c := c + 1 s := 0 c := 1 SI c = n+1 Fin NO Elementos de Programación I 58 Fortran I Algol 58 F l o w - M atic Fortran II C O M T R A N L I S P Cobol Algol 60 Fortran IV A P L C P L S im u l a I BASIC P L /I Algol-W ISW IN S im u l a - 6 7 Algol-68 B C L P B Pascal C Pascal Concurrente S c h e m e M esa C S P Prolog Fortran 77 D P M L Flavors A D A Modula-2 S m a lltalk Objective-C C lascal Fortran 8x Object-Pascal H o p e C + + C o m m o n - L I S P N e w F lavors M iranda Oberon M odula-3 Eiffel Standard-M L Clean Haskell D elphi Java Elementos de Programación I Paradigmas de Programación Programación Declarativa • Programación Funcional: definición de una serie de funciones. • Programación Lógica: definición de hechos y relaciones lógicas entre éstos. • No se indica el orden en el que se computa una función o se deriva un nuevo hecho. Elementos de Programación I 60 Fortran I A lgol 58 Flow-Matic Fortran II C O M T R A N L I S P C o b o l A lgol 60 Fortran IV A P L C P L S im u l a I BASIC PL/I Algol-W ISW IN S im u l a - 6 7 Algol-68 B C L P B Pascal C Pascal Concurrente S c h e m e M esa C S P Prolog Fortran 77 D P M L F lavors A D A Modula-2 Smalltalk Objective-C C lascal Fortran 8x Object-Pasca l H o p e C + + C o m m o n - L I S P New Flavors M iranda Oberon Modula-3 Eiffel Standard-ML Clean Haskell D elphi Java Elementos de Programación I Paradigmas de Programación Programación Orientada a Objetos • Un programa consiste en una colección de objetos que intercambian mensajes. Alumno Conserje Alumno Profesor Elementos de Programación I 62 Paradigmas de Programación Programación Orientada a Objetos • Cada objeto es una entidad que agrupa una cierta información (estado) y un conjunto de mecanismos para manipularla (métodos). Coche precio matrícula color Pintar Vender Elementos de Programación I 63 Fortran I A lgol 58 Flow-Matic Fortran II C O M T R A N L I S P Cobol A lgol 60 Fortran IV A P L C P L S im u l a I BASIC PL/I Algol-W ISW IN S im u l a - 6 7 Algol-68 B C L P B Pascal C Pascal Concurrente S c h e m e M esa C S P Prolog Fortran 77 D P M L F lavors A D A Modula-2 Smalltalk Objective-C C lascal Fortran 8x Obje ct-Pascal H o p e C + + C o m m o n - L I S P New Flavors M iranda Oberon Modula-3 Eiffel Standard-ML Clean Haskell D elphi Java Elementos de Programación I Reconocimiento de Lenguajes Algoritmo ? secuencia de acciones finita, no ambigua y que termina. Lenguaje de Programación ? ?notación para describir algoritmos No han de ser ambiguos. Su sintaxis ha de ser estricta. Elementos de Programación I 65 Reconocimiento de Lenguajes • Para definir la sintaxis de un lenguaje se usa una gramática. • Una gramática es una tupla G = (N, T, A, R) – – – – N: símbolos No terminales T: símbolos Terminales A ? N: Axioma R: Reglas de derivación Elementos de Programación I 66 Reconocimiento de Lenguajes • Notación para describir las reglas: BNF, diagramas de Conway. • Ejemplo: G = (N, T, A, R) – N = {E} – T = {a} – A ??? –R: E ::= E+E E ::= E*E E ::= (E) E ::= a Elementos de Programación I 67 Reconocimiento de Lenguajes • Ejemplo: a + (a*a) E 1 Derivación o parse: E + E 4 1-4-3-2-4-4 3 a ( E ) 2 Árbol Sintáctico E También es posible + E 4 1-3-2-4-4-4 4 a a Elementos de Programación I 68 Reconocimiento de Lenguajes • Ejercicio propuesto: a*((a+a)*a) Hallar una derivación y el árbol sintáctico Elementos de Programación I 69 Reconocimiento de Lenguajes • La notación BNF utiliza los siguientes símbolos: – – – – – ? | {} [] () cadena vacía disyunción repetición opción agrupación E ::= ? E ::= a | b E ::= {B} E ::= [B] E ::= (a|b) (c|d) Elementos de Programación I 70 Reconocimiento de Lenguajes • Los paréntesis angulares (? ?y ? ) se usan para diferenciar los símbolos no terminales de los téminales. • Ejemplo: <letra> ::= a | b | c | . . . | z <dígito> ::= 1 | 2 | 3 | . . . | 9 <ident> ::= <letra>{<letra>|<dígito>} Elementos de Programación I 71 Reconocimiento de Lenguajes • Los diagramas de Conway son una representación gráfica de las reglas gramaticales. – Símbolo terminal a – Símbolo no terminal A – Regla: conjunto de símbolos unidos por flechas. Cada camino de izqd. a dcha. es una derivación. Elementos de Programación I 72 Reconocimiento de Lenguajes • Ejemplo: <letra> a b c <dígito> 0 z <ident> 1 9 letra letra dígito Elementos de Programación I 73 Reconocimiento de Lenguajes • Otros ejemplos: B B A ::= [B? A ::= {B} B D C E A ::= (B | C) (D | E) Elementos de Programación I 74 Reconocimiento de Lenguajes Lenguaje de Alto Nivel Traductor Lenguaje Máquina Elementos de Programación I 75 Reconocimiento de Lenguajes • El funcionamiento de un compilador se divide en dos fases: – Análisis – Síntesis Programa objeto Análisis Síntesis Código fuente Elementos de Programación I 76 Reconocimiento de Lenguajes • La fase de análisis se divide en tres partes: – Análisis Lexicográfico – Análisis Sintáctico – Análisis Semántico Gestión de tablas Tabla de símbolos Léxico Sintáctico Semántico Código fuente errores Elementos de Programación I 77 Reconocimiento de Lenguajes • Léxico: palabras válidas del lenguaje • token: referencia a la categoría a la que pertenece una palabra válida. • Funciones del análisis léxicográfico: – Eliminar comentarios y formato – Detectar errores léxicos (palabras no válidas) – Generar lista de tokens Elementos de Programación I 78 Reconocimiento de Lenguajes • Para comprobar la validez de una palabra se utiliza una gramática. • Ejemplo: alfa := beta + gamma * 23 id asignación id más id por número Elementos de Programación I 79 Reconocimiento de Lenguajes • Funciones del análisis sintáctico: – Comprobar validez secuencia de tokens. – Recopilar información en la tabla de símbolos. • Se emplea una segunda gramática en la que los símbolos terminales son tokens. Elementos de Programación I 80 Reconocimiento de Lenguajes • Árbol sintáctico de la frase anterior: ? sentencia? Identificador asignación ? expresión? (id1) ? expresión? Identificador (id2) más ? expresión? ? expresión? Identificador (id3) por ? expresión? número (23) Elementos de Programación I 81 Reconocimiento de Lenguajes • Funciones del análisis semántico: – Analizar significado de la frase. • Comprobaciones realizadas: –Estáticas: •Tipos •Unicidad •Flujo de Control –Dinámicas: •Ficheros •Errores matemáticos •Rangos Elementos de Programación I 82 Reconocimiento de Lenguajes • La fase de síntesis se divide en tres partes: – Generación de código intermedio – Optimización de código – Generación de código objeto. Gen. Cód. Opt. Cód. Int. Tabla de símbolos Gestión de tablas Programa objeto Gen. Cód. Obj. Bibliotecas del sistema Elementos de Programación I 83 Reconocimiento de Lenguajes • Código intermedio: representación del programa independiente de la máquina. • Ejemplo: temp1 := 23 temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Elementos de Programación I 84 Reconocimiento de Lenguajes • Optimización: buscar código más compacto y eficiente. • Ejemplo: temp1 := id3 * 23 id1 := id2 + temp1 Elementos de Programación I 85 Reconocimiento de Lenguajes • Paso final: generación del código objeto. • Ejemplo: MOV id3, R1 MUL 23, R1 MOV id2, R2 ADD R1, R2 MOV R1, id1 Elementos de Programación I 86 Introducción al Pseudolenguaje • Se empleará un enfoque imperativo. • Notación algorítmica: – – – – Palabras clave sintaxis fija Lenguaje natural sintaxis libre Sangrado o indentación Empleo de comentarios • Ventajas principales: Flexibilidad y Legibilidad Elementos de Programación I 87 Introducción al Pseudolenguaje • Estructura general: Algoritmo Nombre Declaraciones Inicio Acciones Fin Elementos de Programación I 88 Introducción al Pseudolenguaje • Ejemplo: Algoritmo HolaMundo Inicio Escribir (‘Hola Mundo’) Fin Elementos de Programación I 89