Conceptos Básicos Programación I (Plan 1999) Algoritmos y Estructuras de Datos II (Plan 2009) Mgter. Oscar Adolfo Vallejos FaCENA - UNNE
Solución de problemas mediante programas Los computadores desempeñan una gran variedad de tareas La tarea de la programación consiste en describir lo que debe hacer el computador para resolver un problema concreto en un lenguaje de programación. Se identifican de momento las siguientes fases: I.Análisis del problema, estableciendo con precisión lo que se plantea. II.Solución conceptual del problema, describiendo un método (algoritmo) que lo resuelva. III.Escritura del algoritmo en un lenguaje de programación.
Concepto de algoritmo El término “algoritmo" tiene connotaciones más formales que cualquier otro debido a su origen: se trata de una acomodación al castellano del nombre de Muhammad ibn Musa al Jwarizmi, matemático persa que popularizo su descripción de las cuatro reglas (algoritmos) de sumar, restar, multiplicar y dividir.
Una definición de algoritmo Un algoritmo es la descripción precisa de los pasos que nos llevan a la solución de un problema planteado. Estos pasos son, en general, acciones u operaciones que se efectúan sobre ciertos objetos. La descripción de un algoritmo afecta a tres partes: entrada (datos), proceso (instrucciones) y salida (resultados).1
Características de los algoritmos 1.Precisión: Un algoritmo debe expresarse de forma no ambigua. La precisión afecta por igual a dos aspectos: – Al orden (encadenamiento o concatenación) de los pasos que han de llevarse a cabo. – Al contenido de las mismas, pues cada paso debe “saberse realizar“ con toda precisión, de forma automática. 2. Determinismo: Todo algoritmo debe responder del mismo modo ante las mismas condiciones. 3. Finitud: La descripción de un algoritmo debe ser finita.
Características de los algoritmos Ej.: El algoritmo tiene por objetivo sumar dos cantidades enteras. Si se anotan esas cantidades inicialmente en sendas casillas (a las que llamaremos a y b para abreviar), este método consiste en ir pasando de a a b una unidad cada vez, de forma que, cuando a = 0, el resultado será el valor de b.
Una definición formal de algoritmo Definición: Un algoritmo es una cuádrupla que comprende los siguientes elementos: 1.- El conjunto de los estados (llamémosle E) que pueden presentarse en todo momento durante el cálculo. 2.- La identificación de los estados iniciales, o estados posibles al comienzo del algoritmo. 3.- La identificación de los estados finales, como posibles estados al terminar el algoritmo. 4.- Una función de transición entre estados, que describe el efecto de cada paso del cómputo asociado al algoritmo.
Cualidades deseables de un algoritmo 1. Generalidad Es deseable que un algoritmo sirva para una clase de problemas lo más amplia posible. 2. Eficiencia Hablando en términos muy generales, se considera que un algoritmo es tanto más eficiente cuantos menos pasos emplea en llevar a cabo su cometido.
Aspectos de interés sobre los algoritmos Computabilidad – hay problemas no computables (adviértase que, si no se conoce algoritmo que resuelva un problema planteado, sólo se puede asegurar “que no se conoce algoritmo que resuelva ese problema"; en cambio, establecer que un problema “no es computable" requiere demostrar que nunca se podrá encontrar ningún algoritmo para resolver el problema planteado). Décimo problema de Hilbert Problema de la parada Números pedrisco
Aspectos de interés sobre los algoritmos Corrección de algoritmos Es imposible detectar los posibles errores de una forma sistemática. Con frecuencia, la búsqueda de errores (depuración) consiste en la comprobación de un algoritmo para unos pocos juegos de datos. La verificación consiste en la demostración del buen funcionamiento de un algoritmo con respecto a una especificación.
Aspectos de interés sobre los algoritmos Complejidad de algoritmos Resulta de gran interés poder estimar los recursos que un algoritmo necesita para resolver un problema. En máquina secuenciales, estos recursos son el tiempo y la memoria. Como el tiempo requerido por los programas depende en gran medida de la potencia de la máquina ejecutora, es frecuente medir en “pasos" (de coste fijo) el coste del algoritmo correspondiente.
Lenguajes algorítmicos y de programación cualidades: 1. Tienden un puente entre la forma humana de resolver problemas y su resolución mediante programas de computador. Tienen cierta independencia de los lenguajes de programación particulares, de modo que están libres de sus limitaciones y así los algoritmos escritos en ellos se pueden traducir indistintamente a un lenguaje de programación u otro.
Lenguajes algorítmicos y de programación Constituyen una herramienta expresiva con una libertad y flexibilidad próxima a la de los naturales y con el rigor de los de programación. Las únicas restricciones que deberán imponerse a estos lenguajes proceden de las caracter¶³sticas que tienen los algoritmos: expresar sus acciones (qué deben realizar y cuándo) con la precisión necesaria, y que estas acciones sean deterministas. Las acciones, se expresan mediante instrucciones, que son comparables a verbos en infinitivo: asignar.., leer.., escribir...y otras. La concatenación de las instrucciones expresa en qué orden deben sucederse las acciones; esto es, cómo se ensamblan unas tras otras.
Herramientas de Programación Las herramientas de programación mas utilizadas comúnmente para diseñar algoritmos son: Pseudocódigos Diagramas N-S Diagramas de flujo Siendo el pseudocódigo el mas popular por su sencillez y su parecido a el lenguaje humano.
Lenguajes algorítmicos y de programación
Desarrollo sistemático de programas Planificación: En esta fase inicial hay que constatar la verdadera necesidad del producto que se va a desarrollar y valorar los recursos humanos y técnicos que precisa su desarrollo. Análisis: En la fase de análisis se establecen cuáles deben ser la funciones que debe cumplir la aplicación y cómo debe realizarse el trabajo conjunto de los diferentes módulos en que se va a dividir. Diseño: En esta fase se diseña el conjunto de bloques, se dividen en partes y se asignan a los equipos de programadores. Codificación: La fase de codificación se confunde muchas veces con la programación y consiste en escribir los algoritmos en un lenguaje de programación. Es un proceso casi automático. Validación: La fase de validación consiste en aplicar el sistema de pruebas a los módulos, a las conexiones entre ellos (prueba de integración) y, por último, a la totalidad de la aplicación (prueba de validación). Mantenimiento: En la fase de mantenimiento se redacta la documentación actualizada, tanto para el programador como para el usuario. Se inicia la explotación de la aplicación y se detectan y corrigen los errores y deficiencias no advertidas en las fases anteriores, lo que puede suponer un coste añadido importante.
Tipos de Datos Los diferentes objetos de información con los que un programa trabaja se denominan datos. Todos los datos tienen un tipo asociados con ellos que nos servirá para poder conocer con que información trabajaremos. La asignación de tipos a los datos tiene dos objetivos principales: Detectar errores de operaciones aritméticas en los programas Determinar como ejecutar las operaciones
Tipos de Datos Comunes Estos son los tipos de datos mas utilizados en los lenguajes de programación: Numéricos: Dentro de estos tipos se puede hacer mención de los tipos enteros, reales o de coma flotante, y de los exponenciales. Carácter: Se dividen también en caracteres ASCII, como por ejemplo: a A & *, etc.. El otro grupo de caracteres son los strings o cadenas de caracteres, como por ejemplo: "Hola Mundo". Lógicos: Pueden tomar los valores verdadero o falso
El tipo de una expresión El resultado de cada expresión tiene un tipo determinado, independiente de su valor, y que puede conocerse aun ignorando los valores de sus elementos componentes, teniendo en cuenta sólo sus tipos. Así por ejemplo, pueden existir: Expresiones numéricas enteras (como 2 + 3) reales (como 3.14 * Sqr(2.5) Expresiones booleanas (como = 5) Expresiones de caracteres (como Succ('a')).
Identificadores Representan los nombres de los objetos de un programa (constantes, variables, tipos de datos, procedimientos, funciones, etc.). Es un identificador es un método para nombrar a las celdas de memoria en la computadora, en lugar de memorizarnos una dirección de memoria. Se utilizan para nombrar variables, constantes, procedimientos y funciones.
Identificadores Constantes Son valores que no pueden cambiar en la ejecución del programa. Recibe un valor en el momento de la compilación del programa y este no puede ser modificado. Variables Son valores que se pueden modificar durante la ejecución de un programa. Al contrario de las constantes estos reciben un valor, pero este valor puede ser modificado durante la ejecución o la compilación del programa. Funciones/Procedimientos Conjunto de instrucciones y/o variables para la obtención de un resultado. Necesario para el proceso global. Subrutina.
Magter. Oscar Adolfo Vallejos FaCENA - UNNE Operadores utilizados en Programación Operadores aritméticos: Una expresión es un conjunto de datos o funciones unidos por operadores aritméticos (suma, resta, multiplicación, división, exp, mod, etc.) Operadores Lógicos: En ocasiones en los programas se necesitan realizar comparaciones entre distintos valores, esto se realiza utilizando los operadores relaciones.
Magter. Oscar Adolfo Vallejos FaCENA - UNNE Definición de Variables Los datos se definen de tres maneras: Asignación: A = 0; 0 A Resultado de una expresión algebraica: A = (2 * Pi) + ( B / C ) Lectura: Leer ND, ED, CE
Magter. Oscar Adolfo Vallejos FaCENA - UNNE Entrada y Salida (I/O) de Datos La lectura de datos permite asignar valores desde dispositivos hasta archivos externos en memoria, esto se denomina operación de entrada o lectura. A medida que se realizan calculos en el programa, se necesitan visualizar los resultados. Está se conoce como operación de escritura o salida.
Magter. Oscar Adolfo Vallejos FaCENA - UNNE Estructuras de Control Las estructuras de control de un lenguaje de programación se refieren a el orden en que las instrucciones de un algoritmo se ejecutarán. Determinán el flujo de control. Las tres estructuras de control básico son: – secuencia – selección – repetición (Hacer mientras, Hacer hasta) En mayo de 1996, Bôhm y Jacopin demostrarón que un programa propio puede ser escrito útilizando solamente tres tipos de estructuras de control: secuenciales, selectivas y repetitivas.
Enunciado de un problema de complejidad baja Consideremos el problema de hallar el tarea de un círculo a partir de su radio. Un procedimiento sencillo para ello consiste en aplicar la conocida fórmula A = Pi * r2, donde A y r son dos números reales que representan el área y el radio del círculo respectivamente. Para llevar a cabo el procedimiento, necesitaremos conocer el valor de la constante Pi, a la que llamaremos pi (si no se necesita una gran precisión, puede bastar con 3.14). Entonces, el cálculo consiste en averiguar el valor del radio r y aplicar la fórmula para hallar A, que se ofrece como el resultado.
Solución en Pseudo
En Pascal
Arreglos
Los tipos de datos simples o primitivos: son aquellos que no están definidos en términos de otros tipos de datos. Se denominan “primitivos” también porque son los tipos de datos originales que proporcionan la mayoría de los lenguajes de programación. Los tipos de datos estructurados o compuestos están construidos en base a los tipos de datos primitivos. Un ejemplo, es la cadena o string de caracteres. A su vez, las estructuras compuestas pueden ser: Estáticas: cuando el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa. Dinámicas: no tienen limitaciones o restricciones en el tamaño de memoria ocupada (este tipo de estructura no se contempla en esta asignatura).
Arreglos Diferencia entre los tipos de datos Los tipos de datos simples tienen como característica común que cada variable representa un elemento. Por ejemplo: Edad, Temperatura, Importe, etc. Los tipos de datos estructurados tienen como característica común que un identificador (nombre) puede representar múltiples datos individuales, pudiendo cada uno de éstos ser referenciado independientemente. Por ejemplo: Vector de temperaturas diarias, Nombre y Apellido, Registro de alumnos, Matriz Identidad, etc.
Arreglos Tipo de datos estructurado array, que será útil para trabajar con estructuras de datos como, por ejemplo, vectores, matrices, una sopa de letras rectangular, una tabla de multiplicar, o cualquier otro objeto que necesite una o varias dimensiones para almacenar su contenido.
Arreglo Un arreglo (matriz o vector) es un conjunto finito y ordenado de elementos homogéneos. La propiedad ordenado, significa que el elemento primero, segundo,.., enésimo de un arreglo puede ser identificado. La propiedad homogéneo, quiere decir que los elementos son del mismo tipo de datos. Por ejemplo, un arreglo puede tener todos sus elementos de tipo entero, o todos sus elementos de tipo char.
Arreglos Descripción del tipo de datos array Los arrays son tipos de datos estructurados ampliamente utilizados, porque permiten manejar colecciones de objetos de un mismo tipo con acceso en tiempo constante, y también porque han demostrado constituir una herramienta de enorme utilidad. Imaginemos que queremos calcular el producto escalar, U * V de R(3). U*V = u1 *v1 + u2*v2 + u3*v3 Con los datos simples que conocemos hasta ahora, tendríamos que definir una variable para cada una de las componentes de los vectores. var u1, u2, u3, v1, v2, v3: real; Para este caso sería más natural disponer de una variable estructurada que agrupe en un solo objeto las componentes de cada vector.
Arreglos El diagrama sintáctico de la definición de un array es: Su definición en Pascal es:
Arreglos Operaciones con vectores: Asignación Lectura/escritura Recorrido (acceso secuencial) Actualizar (añadir, borrar, insertar) Ordenación Búsqueda
Arreglos Operaciones del tipo array y acceso a sus componentes – Acceso y asignación a componentes de un array Se accede a sus elementos mediante el uso de tantos índices como dimensiones tenga el array, siguiendo el siguiente esquema: idArray [expres1, expres2,..., expresL] idArray [expres1][expres2]...[expresL] Para dar valores a las componentes de un array se usa la instrucción de asignación:
Arreglos Asignación y operaciones de arrays completos Se pueden realizar asignaciones directas de arrays siempre que sean del mismo tipo. Por ejemplo, dadas las definiciones
Arreglos En Pascal no es posible comparar arrays completos aunque sean del mismo tipo. Para realizar esta operación es necesario comparar elemento a elemento, comprobando la igualdad entre ellos. Por ejemplo, suponiendo que m1 y m2 son matrices de tipo tMatriz, la comprobación de su igualdad se puede hacer así:
Arreglos Características generales de un array Los arrays son estructuras homogéneas, en el sentido de que sus elementos componentes son todos del mismo tipo. El tamaño del array queda fijado en la definición y no puede cambiar durante la ejecución del programa, al igual que su dimensión. Los datos de tipo array se pueden pasar como parámetro en procedimientos y funciones, pero el tipo que devuelve una función no puede ser un array (ya que un array es un tipo de datos compuesto).
Arreglos: Vectores En términos generales, un vector es una secuencia, de longitud fija, formada por elementos del mismo tipo.
Arreglos: Vectores Veamos ahora un ejemplo de manejo de vectores en Pascal. Para indicar cuántos viajeros van en cada uno de los 15 vagones de un tren (con una capacidad máxima de 40 personas por vagón), en lugar de utilizar 15 variables enteras (una para cada vagón), se puede y se debe utilizar un vector de la siguiente forma: Haremos referencia al número de pasajeros del vagón i-ésimo mediante vagón[i], mientras que el total de viajeros en el tren será
Arreglos: Matrices Como ya se dijo, los arrays multidimensionales reciben el nombre genérico de matrices. En este apartado se presentan algunos ejemplos de utilización de matrices. Evidentemente, la forma de definir los tipos de datos para las matrices es la misma de todos los arrays, así como el modo de declarar y manipular variables de estos tipos.