ALGORITMOS INTRODUCCIÓN La etapa vital de la solución de un problema con una computadora es el diseño del algoritmo y de la estructura de datos. Un algoritmo es un procedimiento expresado precisamente para obtener la computadora en el lenguaje de programación seleccionado. Los algoritmos se presentan de una manera conveniente para un lector humano, mientras que en los programas sirven a las necesidades de las computadoras. Es importante recordar mientras diseñamos un algoritmo que una computadora sólo sigue las instrucciones y no puede actuar si no se le ha ordenado de manera explícita. Por lo tanto, el solucionador de problemas debe prever cualquier aspecto del problema en el propio algoritmo. La palabra algoritmo se usa en homenaje al matemático UZBEKO ALKUARITZMI quién escribió un libro el cual por primera vez se expresaban métodos precisos para efectuar las cuatro operaciones básicas, las cual hoy en día se siguen utilizando. DEFINICIÓN Todas las tareas que lleva a cabo una computadora se pueden expresar como algoritmos. Una vez que se ha diseñado un algoritmo, se codifica en un lenguaje de programación, y el programa es ejecutado por una computadora. Un algoritmo es un conjunto finito de instrucciones que especifica en una secuencia de operaciones a realizar en orden para resolver un problema específico o clases de problemas. En otras palabras, un algoritmo es un método para la solución del problema. Un algoritmo se puede presentar en varios niveles de detalles. El hardware de una computadora sólo puede obedecer las instrucciones si están expresadas en el lenguaje máquina de la computadora. El diseñador del algoritmo puede encontrar dificultades al pensar en términos de estas instrucciones ya que los detalles pueden oscurecer la esencia del procedimiento. CARACTERISTICAS DE LOS ALGORITMOS: Las características fundamentales que debe cumplir todo algoritmo son: • Un algoritmo debe ser preciso, es decir, debe indicar claramente (sin ambigüedades) cada uno de los pasos a seguir para conseguir el objetivo propuesto. • Un algoritmo debe estar bien definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. • Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea, debe tener un número finito de pasos. 1 • Un algoritmo debe ser independiente tanto del lenguaje de programación en el que se expresa como de la computadora que lo ejecuta. La definición de un algoritmo debe describir tres partes: Entrada, Proceso y Salida. DOMINIO DE UN ALGORITMO Si el algoritmo es general dentro de alguna clase de problemas, entonces es de poca utilidad. Por lo tanto, un método para marcar el número telefónico 2200234 casi no tiene valor para nadie, mientras que un método para marcar cualquier número podría ser útil. Por su puesto, debe haber alguna restricción a la generalidad de un algoritmo. La clase o el conjunto de datos y las condiciones para las cuales un algoritmo trabaja correctamente se llama dominio. Cuando se trata de resolver cualquier problema es necesario definir el dominio del algoritmo y después verificar que trabaja para todos los casos que se encuentran dentro de ese dominio. Al decidir el dominio de un algoritmo es necesario incluir todas las situaciones similares, pero los casos remotos o pocos probables se pueden omitir. ERRORES EN LA CONSTRUCCIÓN DE UN ALGORITMO Errores de dominio: se presentan cuando no se han especificado todas situaciones que se pueden presentar en la práctica o se ha descuidado la apreciación de su importancia. Las pruebas más difíciles son aquellas que verifican que se han seleccionado un dominio correcto para el algoritmo. A medida que el problema se presenta, se tiene que clasificar y hay tres opciones: 1- Ignorarlo porque es improbable y quizás nunca ocurra. 2- Restringir el dominio del algoritmo para excluir. 3- Corregir el algoritmo. Errores de lógica: son aquellos errores que se detectan después de que se ha definido en forma adecuada el dominio de un algoritmo, en la etapa de prueba o verificación. Se deben principalmente a las siguientes causas: 1- Etapas incorrectas. 2- Secuencia incorrecta de etapas. FORMAS DE EXPRESAR O REPRESENTAR UN ALGORITMO Un mismo algoritmo puede ser expresado de distintas formas y en distintos lenguajes. 2 Lenguaje común: en el lenguaje común que hablamos y escribimos; útil para comunicar un algoritmo a otra persona o en una fase de análisis previo de un sistema computacional. Diagramas de flujo: es un lenguaje gráfico; útil para visualizar en forma rápida la secuencia lógica de pasos a seguir por un algoritmo y de gran ayuda para la traducción del mismo a un programa de computación. Tablas de decisión: expresan en forma de tablas las distintas alternativas que intervienen en un algoritmo y las operaciones elementales a realizar en cada alternativa. Muy útiles para analizar la lógica de un algoritmo en forma exhaustiva y precisa. Lenguajes de pseudocódigos: tipo de lenguaje compuesto por una lista de enunciados, algunos de los cuales coinciden con los que se usan en los diagramas de flujo. En la lógica del algoritmo se pueden utilizar distintos tipos de organización o estructuras de control. Se pseudocodifican las estructuras de control de la programación estructurada. Lenguajes de programación: es la forma obligada de expresión de un algoritmo para que pueda ser leído, ejecutado y almacenado por el computador. DIAGRAMAS DE FLUJO Un diagrama de flujo es la representación gráfica o visual de un algoritmo. Se usan en el planteamiento, desarrollo y estructuración de un algoritmo. Mediante los diagramas de flujo el algoritmo se puede comunicar y documentar (porque enseña y describe el proceso). Formalmente, un diagrama de flujo es un diagrama formado por símbolos (cajas, bloques, figuras) y flechas o líneas de flujo que conectan los símbolos entre sí. Los símbolos denotan los pasos esenciales del algoritmo y las fechas indican la secuencia. Se dibujan de tal manera que la dirección del flujo sea hacia abajo o de izquierda a derecha. UTILIDAD DE LOS DIAGRAMAS DE FLUJO El diagrama de flujo refleja los pasos sucesivos que el computador debe dar para llegar a la solución de in problema. Las principales razones por las cuales es generalmente aconsejable el trazado de un diagrama de flujo son las siguientes: • Oportunidad de verificar la lógica de la solución. • Sirve de guía al programador para la codificación del programa. • Permite fácilmente modificar un programa. • Es útil para la discusión grupal. • Sirve para documentar el programa. 3 SIMBOLOGÍA BÁSICA Los símbolos que se describen a continuación son de uso universal: Símbolo Función Indica el principio o fin de un algoritmo. Indica entrada o salida de datos, es decir una lectura o escritura. Procesamiento, se usa generalmente para sentencias o enunciados de asignación (cualquier tipo de operación que pueda originar cambio de valor, formato o posición de la información almacenada en memoria, operaciones aritméticas, de transferencia, etc.). Decisión (indica operaciones lógicas o de comparación entre datos —normalmente dos— y en función del resultado de la misma determina cuál de los distintos caminos alternativos del programa se debe seguir; normalmente tiene dos salidas — respuestas SÍ o NO— pero puede tener tres o más, según los casos). Conector o símbolo de conexión, se usa cuando el diagrama es largo y se requiere más de un hoja de papel o para evitar líneas que se crucen. Para cada rótulo de conectar hay un único conector de entrada y puede haber más de un conector de salida. Llamada a subrutina o a un proceso predeterminado (una subrutina es un módulo independientemente del programa principal, que recibe una entrada procedente de dicho programa, realiza una tarea determinada y regresa, al terminar, al programa principal). Indica la salida impresa de la información. Indica la dirección del algoritmo en cada momento mediante una flecha. 4 ESTRUCTURAS BÁSICAS DE CONTROL DEL FLUJO DE EJECUCIÓN Flujo es la secuencia de instrucciones que se ejecutan desde la primera línea de programa hasta la última. Así, decimos que el flujo de ejecución es la trayectoria que sigue al ir ejecutando todos los pasos presentes en un algoritmo. La estructura de control es cualquier herramienta que controle el flujo de ejecución de un algoritmo. Un programa se puede construir mediante tres tipos de estructuras básicas de control: • Secuencial • Selectiva • Repetitivas ESTRUCTURA SECUENCIAL Es la que sigue la máquina si no se le especifica lo contrario. Las sentencias se ejecutan una a continuación de otra, siguiendo el orden en el que están definidas. Su representación en un diagrama de flujo sería: ESTRUCTURA SELECTIVA Las estructuras selectivas son también llamadas de decisión. Las estructuras selectivas se utilizan para tomar decisiones lógicas. También se las llama condicionales, ya que consisten en la ejecución de una o más sentencias, dependiendo de la evaluación de una condición y de que sí ésta se cumple o no. 5 TIPOS DE ESTRUCTURAS SELECTIVAS: SIMPLE Se ejecutará si la condición de la expresión lógica es verdadera. DOBLE Consiste en realizar una pregunta y ejecutar una serie de instrucciones si la respuesta es verdadera, o bien ejecutar otra serie de instrucciones si al respuesta es falsa. 6 MÚLTIPLE Necesidad de más de dos opciones. La estructura de selección múltiple evalúa una condición la cual puede adoptar n valores posibles. Según sea el valor dado por la condición se ejecuta un determinado conjunto de acciones. ESTRUCTURAS REPETITIVAS Las estructuras repetitivas son aquellas que repiten un conjunto de acciones un número de veces. Podemos definir: • Bucle o ciclo: toda estructura de control en la que se ejecutan una serie de instrucciones, en el orden en que aparecen, tantas veces como se cumpla una condición. • Cuerpo del bucle: es el conjunto de acciones que se ejecutan de forma secuencial dentro del bucle. • Iteración: se produce una iteración cada vez que se ejecutan las sentencias que hay en el cuerpo del bucle (es el hecho de repetir la ejecución de una secuencia de acciones). Los tipos de estructuras repetitivas son el WHILE, DO-WHILE, REPEAT UNTIL y FOR. 7 ESTRUCTURA REPETITIVA WHILE (MIENTRAS) La estructura repetitiva mientras (en inglés while) es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la instrucción mientras, la primera cosa que sucede es que se evalúa la condición (una expresión booleana). Si se evalúa falsa, no se toma ninguna acción y el programa prosigue en la siguiente instrucción del bucle. Si la expresión booleana es verdadera, entonces se ejecuta el cuerpo del bucle, después de lo cual se evalúa de nuevo la expresión booleana. Este proceso se repite una y otra vez mientras la expresión booleana (condición) sea verdadera. ESTRUCTURA REPETITIVA DO-WHILE (HACER MIENTRAS) Esta estructura es muy similar a la anterior, sólo que a diferencia del while el contenido del bucle se ejecuta siempre al menos una vez, ya que la evaluación de la condición se encuentra al final. De esta forma garantizamos que las acciones dentro de este bucle sean llevadas a cabo, aunque sea una vez independientemente del valor de la condición. 8 ESTRUCTURA REPETITIVA FOR (PARA) La estructura FOR es un poco más compleja que las anteriores y nos permite ejecutar un conjunto de acciones para cada elemento de un arreglo, o para cada paso de un conjunto de elementos. Su implementación depende del lenguaje de programación, pero en términos generales podemos identificar tres componentes: la inicialización, la condición de corte y el incremento. Su uso principal se orienta a los vectores, pudiendo modificar, agregar, eliminar o consultar datos que se encuentren según el índice. ANIDAMIENTO Es cualquier estructura de control en la que aparezca otra estructura de control. Las estructuras internas deben estar totalmente contenidas dentro de la externa y no puede existir solapamiento. 9