DR AF T Algoritmos Teotihuacan (”Lugar donde los hombres se convierten en dioses”) es el nombre que se da a la que fue una de las mayores ciudades prehispánicas de Mesoamérica. El nombre es de origen náhuatl y fue empleado por los mexicas para identificar a esta ciudad construida por una civilización anterior a ellos y que ya se encontraba en ruinas cuando los mexicas la vieron por primera vez. A la fecha se desconoce el nombre que le daban sus habitantes originales. Los restos de la ciudad se encuentran al noreste del valle de México, en los municipios de Teotihuacan y San Martı́n de las Pirámides, aproximadamente a 45 kilómetros de distancia del centro de la Ciudad de México. La zona de monumentos arqueológicos fue declarada Patrimonio de la Humanidad por Unesco en 1987. (http://es.wikipedia.org/wiki/Teotihuacan). palabra palabra Autor: Jorge Luis Zapotecatl López Correo electrónico: [email protected] Url: www.pensamientocomputacional.org 2 DR AF T c D.R. 2014 por Insituto Nacional de Astrofı́sica, Óptica y Electrónica Luis Enrique Erro 1, Tonantzintla, Puebla, México C.P. 72840 Teléfono: (222) 247.29.40 Contacto: [email protected] Índice general Índice general 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DR AF T 1. Algoritmos 1.1. Introducción . . . . . . . . . . . 1.2. Algoritmos en la computación . 1.3. Representación de algoritmos . 1.3.1. Diagramas de flujo . . . 1.3.2. Seudocódigo . . . . . . . 1.4. Variables . . . . . . . . . . . . . 1.4.1. Contadores . . . . . . . 1.4.2. Acumuladores . . . . . . 1.4.3. Banderas . . . . . . . . 1.5. Estructuras de control . . . . . 1.5.1. Estructura de secuencia 1.5.2. Estructura de selección . 1.5.3. Estructura de repetición 1.6. Apilamiento y Anidamiento . . 1.7. Enfoque descendente . . . . . . 1.7.1. Nivel 1 . . . . . . . . . . 1.7.2. Nivel 2 . . . . . . . . . . 1.8. Aplicando los Algoritmos . . . . Bibliografı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 7 8 9 11 12 12 14 15 15 15 17 22 27 28 29 30 32 33 3 DR AF T palabra Capı́tulo 1 Algoritmos 1.1. DR AF T “Si quieres construir un barco, no empieces por buscar madera, cortar tablas o distribuir el trabajo. Evoca primero en los hombres y mujeres el anhelo del mar libre y ancho” -Antoine de Saint-Exupéry Introducción Cuando se escucha la palabra algoritmo, las personas frecuentemente consideran que es demasiado sofisticada y exclusivamente relacionada con las ciencias. Sin embargo, los algoritmos se encuentran ampliamente relacionados tanto en la vida cotidiana como en el quehacer profesional de cada persona. Un algoritmo es simplemente una serie de pasos ordenados que se siguen para resolver un problema. Algunos ejemplos en la vida cotidiana donde se emplean algoritmos frecuentemente para resolver problemas son: una persona que utiliza un instructivo para armar un mueble, los trabajadores que ejecutan un conjunto de órdenes por parte de su jefe, los cocineros que utilizan recetas para preparar platillos, entre otros. Un ejemplo de algoritmo para preparar un tı́pico platillo mexicano, el mole poblano, se presenta a continuación (ver Figura 1.1). 5 6 CAPÍTULO 1. ALGORITMOS 1. Remojar los chiles en agua caliente. 2. Moler los chiles, los ajos y el chocolate, hasta formar una pasta. 3. Freı́r dicha pasta en manteca caliente, sazonarla con sal y añadir el caldo suficiente para que tome buen espesor. DR AF T 4. Agregar la carne cocida para la que se preparó el mole. Figura 1.1: -Kukulkán- El resultado de aplicar el algoritmo anterior es un exquisito mole poblano. El mole poblano es un tı́pico platillo mexicano que está compuesto principalmente de una salsa creada a partir de una gran variedad de ingredientes vertida sobre piezas de guajolote (nombre que se le da en México al pavo doméstico). Un problema en particular frecuentemente puede resolverse de varias maneras, por lo tanto, tendrá varios algoritmos que puedan solucionarlo. Por ejemplo, considere los algoritmos de un cocinero, es decir, las recetas. El mole poblano tiene diferentes recetas para preparase. Si una persona está tratando de hacer un delicioso mole poblano para su familia, tiene varias recetas que puede utilizar para lograr su objetivo. Sin embargo, los resultados no serán los mismos porque algunas recetas pueden llevar mayor tiempo de preparación, pueden usar ingredientes costosos, ingredientes que son difı́ciles de conseguir, tener mucha azúcar, o una gran variedad de otras condiciones que afectaran su utilidad. Al igual que en las recetas, los algoritmos que resuelven un determinado problema tienen diferentes ventajas y desventajas, algunos algoritmos tardaran más tiempo en encontrar soluciones, otros algoritmos consumirı́an más memoria, entre otros aspectos. 1.2. ALGORITMOS EN LA COMPUTACIÓN 7 Para el pensamiento computacional los algoritmos son uno de los tópicos principales en el proceso de solución de problemas. Entre los objetivos operativos del pensamiento computacional que se relacionan estrechamente con los algoritmos son: Formular problemas de manera que permitan usar computadores y otras herramientas para solucionarlos. Automatizar soluciones mediante pensamiento algorı́tmico. 1.2. DR AF T Identificar, analizar e implementar posibles soluciones con el objeto de encontrar la combinación de pasos y recursos más eficiente y efectiva. Algoritmos en la computación Los algoritmos son ampliamente utilizados en las ciencias de la computación y representan las soluciones a nivel conceptual de determinados problemas. La computadora al igual que el ser humano maneja varios lenguajes, los denominados lenguajes de programación, que permiten indicar que instrucciones deben ejecutarse. Cuando un algoritmo es implementado en un lenguaje de programación se le denomina “programa”y por lo tanto se vuelve una solución aplicada en la vida real. Todo el software que utilizamos diariamente como lo son los sistemas operativos, las aplicaciones ofimáticas, los video juegos, los navegadores, son programas basados en algoritmos que se implementan por medio de lenguajes de programación (ver figura 1.2). Por lo tanto, los algoritmos están presentes al utilizar equipos de cómputo como los son: teléfonos móviles, computadoras, calculadoras, entre otros. Por ejemplo, en un supermercado cuando la cajera aplica el escáner a un producto, la computadora aplica un algoritmo de búsqueda para encontrar el precio de dicho producto. Los conceptos subyacentes de un algoritmo no se ven afectados por las capacidades de un lenguaje de programación o las capacidades de una computadora en particular. Como analogı́a, el resultado de una receta que haya sido escrita correctamente no debe ser afectada por el cocinero o la cocina. 8 CAPÍTULO 1. ALGORITMOS (a) Video juegos (Mega Man XTM ). (b) Animaciones 3D (AvatarTM ). Figura 1.2: DR AF T Los video juegos y las animaciones en 3D son ejemplos de algoritmos implementados en computadoras por medio de lenguajes de programación Figura 1.3: -Paat- GameCoder Studios es un estudio independiente de video juegos mexicano ubicado en la ciudad colonial de Guanajuato, México. En el 2010 dicho estudio desarrolló el motor GC, un motor gráfico de video juegos 3D. Algunas de las técnicas de representación utilizadas en el motor GC fueron innovadoras y se presentaron en el SIGGRAPH 2011. En el 2011 el estudio desarrolló el video juego Attractio basado en el motor GC. Para mayor información puede consultar el enlace: www.gamecoderstudios.com 1.3. Representación de algoritmos Los algoritmos se representan de varias formas, incluyendo el lenguaje natural (utilizado para representar el algoritmo del mole poblano en la sección 1.1), seudocódigo, diagramas de flujo y lenguajes de programación, entre otros. Las descripciones en lenguaje natural son ambiguas y extensas, mientras que los seudocódigos y el diagramas de flujo evitan las ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para 1.3. REPRESENTACIÓN DE ALGORITMOS 9 representar algoritmos. Además, se mantienen independientes de un lenguaje de programación especı́fico. 1.3.1. Diagramas de flujo DR AF T Los diagramas de flujo son la representación visual de cada paso del algoritmo por medio de sı́mbolos que representan las operaciones ejecutadas sobre los datos. Dicha simbologı́a ha sido estandarizada por las organizaciones ANSI (American National Standars Institute) y la OSI (International Standarization Organization). Los diagramas de flujo son usados principalmente para introducir a los estudiantes en el desarrollo de algoritmos por su facilidad de lectura. Son usados principalmente para representar algoritmos pequeños debido a que abarcan demasiado espacio y su construcción es laboriosa. En la figura 1.4 se muestran los sı́mbolos básicos de los diagramas de flujo. Figura 1.4: Sı́mbolos básicos de los diagramas de flujo 10 CAPÍTULO 1. ALGORITMOS DR AF T Por ejemplo, considera el algoritmo representado por medio de un diagrama de flujo de la figura 1.5 que determina el número mayor entre A y B. El primer sı́mbolo terminal indica el inicio del algoritmo y la lı́nea de flujo indica la dirección de la siguiente instrucción a ejecutarse. El sı́mbolo imprimir le indica al usuario, por medio de un mensaje, que debe ingresar dos valores. El usuario introduce dos números de entrada, indicado por el sı́mbolo de entrada y salida. Posteriormente, aplicando el operador de mayor o igual dentro del sı́mbolo de decisión se selecciona el mensaje que imprime el número mayor (o igual). El algoritmo termina con el sı́mbolo terminal. Figura 1.5: Algoritmo que determina el mayor número entre A y B . 1.3. REPRESENTACIÓN DE ALGORITMOS 1.3.2. 11 Seudocódigo DR AF T El seudocódigo es una descripción informal de alto nivel de un algoritmo que utiliza las convenciones de un lenguaje de programación real. Sin embargo, está diseñado para que el algoritmo sea leı́do por un humano. Por lo tanto, el seudocódigo se complementa, donde sea conveniente, con descripciones detalladas en lenguaje natural, o con notación matemática compacta. Además, omite detalles que no son esenciales para su comprensión, tales como especificar el tipo de variables, código especı́fico del sistema y algunas funciones (subrutinas). Para el seudocódigo no existe una sintáxis estándar y por lo general, no obedece a las reglas de sintáxis de ningún lenguaje de programación en particular. Dependiendo del diseñador, el seudocódigo puede diferir en su estilo, desde acercarse a una descripción en lenguaje natural (en prosa) por un extremo hasta una imitación casi exacta de un lenguaje de programación real por el otro. El algoritmo 1, representado por medio de un seudocódigo, computa el número mayor o igual entre A y B. Algorithm 1 Número mayor o igual 1: 2: 3: 4: 5: 6: 7: imprimir(0 Introduzca los valores0 ); introducir(A, B); if A ≥ B then imprimir(A, 0 Es mayor o igual0 ); else imprimir(B, 0 Es mayor0 ); end if . Desde el teclado El seudocódigo presentan las siguientes ventajas con respecto a los diagramas de flujo: El espacio utilizado en la descripción del problema es mucho menor. Las operaciones complejas son presentadas de forma más sencilla. El seudocódigo es más sencillo de trasladar a un lenguaje de programación. Las reglas de identación permiten observar claramente los niveles en la estructura del algoritmo. 12 CAPÍTULO 1. ALGORITMOS En las secciones siguientes los algoritmos son explicados principalmente utilizando seudocódigo. No obstante, se presentan los diagramas de flujo pertinentes en cada sección. 1.4. Variables DR AF T Una variable es un sı́mbolo que designa una cantidad susceptible de tomar distintos valores y que almacena información durante la ejecución de un algoritmo. En los algoritmos, cada diseñador utiliza sus respectivas convenciones. Por ejemplo, la instrucción “asignar el valor de la variable x a la variable y”puede representarse como: x←y x=y x := y Las operaciones usualmente se representan de manera matemática compacta. 2 volumen ← πr√ h hipotenusa ← a2 + b2 resultado ← sin(a) En una operación de asignación, usualmente se asigna el valor que resulta de los cálculos ejecutados a la derecha de una expresión a la variable que se encuentra a la izquierda. Por ejemplo, si x = 0 y ejecutando la siguiente operación: x = x + 1. El valor adquirido al ejecutar la instrucción anterior es x = 1. En los algoritmos la forma en que algunas variables se utilizan es recurrente al servir como auxiliares en la ejecución de instrucciones. La forma en que algunas variables se utilizan se clasifican en: contadores, acumuladores y banderas. 1.4.1. Contadores Los contadores son variables que cuentan el número de eventos ejecutados dentro de un algoritmo. Un contador incrementa o decrementa su contenido en un valor constante. El conteo inicia generalmente en 0 o 1. Las operaciones necesarias que se llevan a cabo con un contador son: 1.4. VARIABLES 13 1. Inicialización. Esta operación permite asignar el valor inicial de la variable contador. contador = valor inicializacion. 2. Incremento o decremento. Esta operación se realiza cada vez que ocurre el evento que se desea contar. Usualmente el valor constante es de 1. Sin embargo, se puede asignar otra magnitud en determinados casos. contador = contador + 1 (incremento) contador = contador − 1 (decremento) DR AF T Suponga que un evento ocurre tres veces, el contador adquirirá los valores como se indica en la siguiente tabla. contador = contador+ 1 1 0 1 2 1 1 3 2 1 Por ejemplo, en el video juego Mario BrosTM se utiliza un contador para almacenar el tiempo, las vidas o la cantidad de monedas que ha recolectado (ver figura 1.6). Figura 1.6: Contadores en el video juego Mario BrosTM . 14 CAPÍTULO 1. ALGORITMOS 1.4.2. Acumuladores Los acumuladores incrementan o decrementa su contenido en un valor variable. La acumulación inicia generalmente en 0 o 1. La operación básica que se debe realizar con ellos es: 1. Inicialización. La inicialización de un acumulador dependerá del tipo de operación que se va a realizar. Usualmente se inicilaliza en 0 o en 1. 2. Incremento o decremento. Esta operación se realiza cada vez que ocurre el evento que se desea acumular. DR AF T acumulador = acumulador + variable Suponga el calculo de la nomina de un empleado, el acumulador adquirirá los valores como se indica en la siguiente tabla. nomina = nomina+ sueldo 1200 0 1200 1700 1200 500 3200 1700 1500 Por ejemplo, en el video juego Street Fighter IITM se utiliza un acumulador para variar la cantidad de vida en la barra amarilla superior (ver figura 1.7). Figura 1.7: Acumuladores en el video juego Street Fighter IITM . 1.5. ESTRUCTURAS DE CONTROL 1.4.3. 15 Banderas Las banderas son variables que adquieren determinados valores con la finalidad de interrumpir o seleccionar la ejecución de determinadas instrucciones en un algoritmo. Por ejemplo, para inidar que se presionó el botón de start en el control de tu consola favorita o para indicar que el juego a terminado (game over ), la bandera adquirirá el valor como se indica en la siguiente tabla. bandera = f also bandera = verdadero Estructuras de control DR AF T 1.5. N o se ha presionado el botón Se ha presionado el botón Investigaciones realizadas en la década de los 70 por C. Böh y G. Jacopini demostraron que algoritmos estructurados pueden codificarse utilizando sólo tres estructuras de control: la estructura de secuencia, la estructura de selección y la estructura de repetición. Antes de dichas investigaciones, se utilizaba de manera excesiva el uso de la instrucción de transferencia incondicional (GOTO), que producia “código espagueti”, que es mucho más difı́cil de seguir, mantener y era la causa de muchos errores. Por lo tanto, surge lo que se conoce como programación estructurada, la cual construye los algoritmos a partir unicamente de las estructuras de control: secuencia, selección y repetición, las cuales se explican a continuación. 1.5.1. Estructura de secuencia En un algoritmo, la estructura de secuencia establece que las instrucciones escritas en seudocódigo son ejecutadas en orden secuencial de arriba a abajo. Considera el siguiente bloque de instrucciones. instruccion1 ; instruccion2 ; instruccion3 ; ... instruccionn ; La instrucción1 se ejecuta primero (renglón número 1), posteriormente se ejecuta la instrucción2 , y de manera sucesiva se ejecutan las demás ins1: 2: 3: 4: 5: 16 CAPÍTULO 1. ALGORITMOS DR AF T trucciones hasta ejecutarse la instrucción n. El algoritmo representado por un diagrama de flujo se muestra en la figura 1.8. Figura 1.8: Diagrama de flujo que muestra el funcionamiento de la estructura de secuencia. Por ejemplo, considere el algoritmo “asistir al trabajo”que realiza un empleado para levantarse de la cama y asistir al trabajo: levantarse; quitarse la pijama; tomar un baño; vestirse; desayunar; tomar el transporte hacia el trabajo; El algoritmo anterior consigue que el empleado se presente al trabajo en tiempo y forma al realizar acciones de manera sucesiva. Ahora, suponga que las mismas instrucciones del algoritmo “asistir al trabajo”se ejecutan en un orden ligeramente diferente: 1: 2: 3: 4: 5: 6: 1: 2: 3: levantarse; quitarse la pijama; vestirse; 1.5. ESTRUCTURAS DE CONTROL 17 tomar un baño; desayunar; tomar el transporte hacia el trabajo; En este caso, el empleado llegará mojado al trabajo (ver figura 1.9). El ejemplo anterior muestra la importancia de especificar el orden correcto en que se ejecutan las instrucciones para obtener el resultado deseado. Figura 1.9: DR AF T 4: 5: 6: El orden en que las instrucciones son ejecutadas determina el resultado correcto de un algoritmo, si se cambia el orden de una instrucción el ejecutivo llegará mojado al trabajo. 1.5.2. Estructura de selección En un algoritmo, la estructura de selección permite decidir que instrucciones se deben ejecutar dependiendo de alguna condición. En la vida real, cada dı́a las personas constantemente tienen que decidir qué actividades realizar. Por ejemplo, salir a correr o quedarse en la cama, escoger entre estudiar o jugar, decidir si comer a las 2:00 P.M. o a las 3:00 P.M., entre muchos otros ejemplos (ver figura 1.14). En esta sección se presentan tres variantes de la estructura de selección: seleccionar simple, seleccionar doble y seleccionar múltiple. Seleccionar simple La estructura seleccionar simple decide que instrucciones deben ejecutarse dependiendo del cumplimiento de una condición, donde la condición es 18 CAPÍTULO 1. ALGORITMOS Figura 1.10: Las decisiones se toman dependiendo de que actividades se desean realizar. Por ejemplo, DR AF T una chica decidirá la forma de vestirse de acuerdo al tipo de fiesta al que asistirá. una expresión booleana, es decir, el valor de la condición es verdadero o falso (1 o 0). Considera el siguiente bloque de instrucciones. if condicion1 then instrucciones1 ; end if Si la condicion1 es evaluada como verdadera (especificada en el renglón 1), entonces se ejecutan las instrucciones1 que se encuentran dentro del cuerpo de la estructura. Por otro lado, si la condición es falsa las instrucciones1 dentro del cuerpo son evitadas. El bloque anterior representado por un diagrama de flujo se muestra en 1.11. 1: 2: 3: Figura 1.11: Diagrama de flujo que muestra el funcionamiento de la estructura seleccionar simple. 1.5. ESTRUCTURAS DE CONTROL 19 La estructura seleccionar simple se utiliza cuando: El problema requiere ejecutar o evitar determinadas acciones con base en una condición. Por ejemplo, suponga que una joven, en sus vacaciones, ha decido asistir a un curso de natación unicamente si el horario de las sesiones es mayor a las 7:00 hrs. El bloque de instrucciones mediante la estructura de selección simple se representa a continuación. 1: if horario sesión > 7 then 2: Asistir al curso de natación; 3: end if DR AF T Seleccionar doble La estructura seleccionar doble decide que instrucciones deben ejecutarse entre dos posibles opciones dependiendo del cumplimiento de una condición. Al igual que en la estructura seleccionar simple, la condición es una expresión booleana. Considera el siguiente bloque de instrucciones. if condicion1 then instrucciones1 ; else instrucciones2 ; end if Si la condicion1 es evaluada como verdadera (especificada en el renglón 1), entonces se ejecutan las instrucciones1 que se encuentran dentro del primer bloque de la estructura. Por otro lado, si la condición es falsa se ejecutan las instrucciones2 que se encuentran dentro del segundo bloque de la estructura. El bloque anterior representado por un diagrama de flujo se muestra en 1.12. La estructura seleccionar doble se utiliza cuando: 1: 2: 3: 4: 5: El problema requiere elegir que conjunto de instrucciones ejecutar entre dos opciones con base en una condición. Por ejemplo, suponga que un profesor de matemáticas califica un examen de álgebra. Si la calificación de un estudiante es mayor o igual que 6, entonces el estudiantes es aprobado. En caso contrario, al profesor no le gusta reprobar 20 CAPÍTULO 1. ALGORITMOS Figura 1.12: Diagrama de flujo que muestra el funcionamiento de la estructura seleccionar doble. 1: 2: 3: 4: 5: DR AF T a sus alumnos, pero no le queda otra opción que hacerlo. El bloque de instrucciones mediante la estructura de selección doble se representa a continuación. if calif icación ≥ 6,0 then aprobar a estudiante; else reprobar a estudiante; end if Seleccionar múltiple La estructura de selección múltiple decide que instrucciones deben ejecutarse entre varias opciones dependiendo del cumplimiento de determinada condición. La estructura de selección múltiple esta constituida por el apilamiento de estructuras de selección simple. Cada serie de condiciones tienen que ser mutuamente excluyentes, si una de ellas se cumple las demás tienen que ser falsas necesariamente. Si ninguna de las condiciones se cumple opcionalmente puede agregarse un caso por omisión. Considera el siguiente bloque de instrucciones. 1: 2: 3: 4: if condición1 then instrucciones1 ; else if condición2 then instrucciones2 ; 1.5. ESTRUCTURAS DE CONTROL 21 ... else if condiciónn then instruccionesn ; else instruccionesomision ; end if Si la condición1 es evaluada como verdadera (especificada en el renglón 1), entonces se ejecutan las instrucciones1 que se encuentran dentro del primer bloque de la estructura. En caso contrario, se procede a verificar la condición2 (especificada en el renglón 3), si es evaluada como verdadera, entonces se ejecutan las instrucciones2 dentro del segundo bloque de la estructura. El proceso continua hasta que no quedan más opciones. Si ninguna condición es cumplida, se ejecuta por omisión las instruccionesomision . El bloque anterior representado por un diagrama de flujo se muestra en 1.12. DR AF T 5: 6: 7: 8: 9: 10: Figura 1.13: Diagrama de flujo que muestra el funcionamiento de la estructura seleccionar múltiple. La estructura seleccionar múltiple se utiliza cuando: 22 CAPÍTULO 1. ALGORITMOS El problema requiere elegir que conjunto de instrucciones ejecutar entre múltiples opciones con base en diversas condiciones. Imagina que Tukkul desea obsequiarle un regalo a Paat con el que manifieste sus sentimientos, pero sólo cuenta con $200 pesos. Por lo que seleccionará un regalo que tenga un costo igual o menor que 200 pesos. Si ningún regalo cumple con dicha condición, entonces le escribirá un poema :3. 4: 5: 6: 7: 8: 9: 10: if Orquı́deas ≤ 200 then Comprar Orquı́deas; else if El placer de descubrir de F eymman ≤ 200; then . Paat ama la ciencia Comprar dicho libro; else if El CD Surf ing with the Alien ≤ 200 then Comprar dicho disco; ... else Escribir un P oema; end if 1.5.3. DR AF T 1: 2: 3: Estructura de repetición En un algoritmo, la estructura de repetición permite repetir determinadas instrucciones dependiendo de una condición. En la vida real, cada dı́a las personas constantemente tienen que repetir actividades. Por ejemplo, actividades como caminar, escribir, leer, hablar, implican repetir el conjunto de acciones, entre muchos otros ejemplos (ver figura 1.14). En esta sección se presentan tres variantes de la estructura de repetición: repetir mientras, repetir hasta y repetir para. Repetir mientras La estructura repetir mientras permite repetir determinadas instrucciones mientras su condición permanezca verdadera. Considera el siguiente bloque de instrucciones. while condicion1 do instrucciones1 ; 1.5. ESTRUCTURAS DE CONTROL 23 Figura 1.14: Hay actividades que son repetidas continuamente. Por ejemplo, cuando tocas las cuerdas DR AF T de una guitarra. end while Si la condicion1 es evaluada como verdadera (especificada en el renglón 1), entonces se ejecutan las instrucciones1 que se encuentran dentro del cuerpo de la estructura. Posteriormente el proceso anterior se repite, se evalúa la condicion1 , si es verdadera se ejecutan las instrucciones1 . Finalmente, cuando la condición es falsa la repetición termina. El bloque anterior representado por un diagrama de flujo se muestra en 1.15. Figura 1.15: Diagrama de flujo que muestra el funcionamiento de la estructura repetir mientras. La estructura repetir mientras se utiliza cuando: El problema a resolver requiere que la condición sea evaluada primero. 24 CAPÍTULO 1. ALGORITMOS El número de ciclos que deben ejecutarse para resolver el problema es desconocido. Por ejemplo, suponga que un bibliotecario guarda en una caja un conjunto de libros. El bibliotecario primero verifica que la caja tenga espacio. El bibliotecario no sabe cuántos libros entrarán en la caja, por lo tanto, el proceso se repetirá mientras la caja todavı́a tenga espacio. El bloque de instrucciones mediante la estructura de repetir mientras se representa a continuación. while hay espacio = verdadero do guardar libro; end while DR AF T 1: 2: 3: Repetir hasta La estructura repetir hasta permite repetir determinadas instrucciones hasta que su condición sea falsa. Considera el siguiente bloque de instrucciones. repeat instrucciones1 ; until condicion1 Las instrucciones1 dentro del cuerpo de la estructura son ejecutadas primero, por lo que dichas instrucciones se ejecutan por lo menos una vez. Posteriormente la condicion1 es evaluada (especificada en el renglón 3). Si la condicion1 es verdadera, nuevamente se ejecutan las instrucciones1 dentro del cuerpo de la estructura y posteriormente se vuelve a verificar la condicion1 . El proceso anterior se repite hasta que la condición es falsa y por lo tanto la repetición termina. El bloque anterior representado por un diagrama de flujo se muestra en 1.15. La estructura repetir hasta se utiliza cuando: 1: 2: 3: El problema a resolver requiere ejecutar determinadas instrucciones primero y posteriormente la condición. El número de ciclos que deben ejecutarse para resolver el problema es desconocido. 1.5. ESTRUCTURAS DE CONTROL Diagrama de flujo que muestra el funcionamiento de la estructura repetir hasta. DR AF T Figura 1.16: 25 Por ejemplo, suponga que un jugador debe lanzar dos dados hasta obtener como suma un valor mayor que 10. Probablemente en el primer intento lo consiga o hasta después de n intentos. No obstante, tiene que lanzar los dados por lo menos una vez para constatar la condición. El bloque de instrucciones mediante la estructura de repetir hasta se representa a continuación. 1: 2: 3: repeat suma = valor de los dados lanzados; until suma ≥ 10 Repetir para La estructura de repetir para permite repetir instrucciones un determinado número de veces. Es utilizada cuando se conoce el número de repeticiones que se deben realizar y cuando se desea iterar por cada uno de los elementos de una estructura de datos. Considere el siguiente bloque de instrucciones. for inicializacion; condicion1 ; incremento do instrucciones1 ; end for La estructura repetir para utiliza un contador para realizar el control del número de ciclos que se ejecutaran. La instrucción For (renglón 1) se divide 1: 2: 3: 26 CAPÍTULO 1. ALGORITMOS DR AF T en tres partes: inicialización, condición e incremento. La inicialización y el incremento corresponden a las operaciones de un contador explicadas en la sección 1.4. Si la condicion1 es verdadera se ejecutan las instrucciones1 que se encuentran dentro del cuerpo de la estructura. Posteriormente el proceso anterior se repite, se evalúa la condicion1 , si la condicion1 es verdadera se ejecutan las instrucciones1 dentro del cuerpo de la estructura. Finalmente, cuando la condicion1 es falsa la repetición termina. El bloque de instrucciones mediante la estructura de repetir para se representa a continuación. Figura 1.17: Diagrama de flujo que muestra el funcionamiento de la estructura repetir para. La estructura repetir para se utiliza cuando: El número de ciclos que deben ejecutarse es conocido. Se desea iterar por cada uno de los elementos de una estructura de datos. Por ejemplo, suponga que una ama de casa compra los productos que necesita a partir de una lista de compras. El número de veces que se repetirá la acción de comprar un producto es conocido con anticipación porque está determinado por el número de elementos presentes en la lista. El bloque de instrucciones mediante la estructura de repetir para se representa a continuación. 1: 2: 3: for i = 1; i < número elementos; i = i + 1 do comprar productoi ; end for 1.6. APILAMIENTO Y ANIDAMIENTO 1.6. 27 Apilamiento y Anidamiento El apilamiento se refiere a colocar una estructura de control después de otra. El siguiente ejemplo muestra en seudocódigo una estructura de control seleccionar simple y una estructura de control repetir mientras apilada. if condicion1 then instrucciones1 ; end if while condicion2 do instrucciones2 ; end while El anidamiento se refiere a colocar una estructura de control dentro de otra. Cualquier instrucción puede ser sustituida por una estructura de control. En la misma manera en la que bloques de plástico interconectables son apilados y anidados para crear diversas estructuras (ver figura 1.18). DR AF T 1: 2: 3: 4: 5: 6: Figura 1.18: Un bloque puede ser anidado en lugar de otros bloques, el bloque magenta fue sustituido por los tres bloques apilados. El siguiente ejemplo muestra en seudocódigo una estructura de control repetir mientras anidada dentro de una estructura seleccionar simple. 1: 2: 3: 4: 5: if condicion1 then while condicion2 do instrucciones1 ; end while end if 28 CAPÍTULO 1. ALGORITMOS Por otro lado, el siguiente ejemplo muestra en seudocódigo una estructura de control seleccionar simple anidada dentro de una estructura repetir mientras. while condicion2 do if condicion1 then instrucciones1 ; end if end while Cuando las estructuras de control son apiladas y anidadas forman algoritmos de mayor complejidad. En la misma manera que al apilar y anidar bloques de plástico nos permite crear estructuras más complejas (ver figura 1.19). DR AF T 1: 2: 3: 4: 5: Figura 1.19: Los bloques de plástico interconectables son apilados y anidados para crear diversas estructuras. 1.7. Enfoque descendente Una técnica denominada enfoque descendente (top-down) es una técnica esencial para el diseño de algoritmos correctamente estructurados. En el enfoque descendente se formula una representación del algoritmo en un al- 1.7. ENFOQUE DESCENDENTE 29 to nivel de abstracción (sin especificar detalles) de lo que el algoritmo debe realizar. Posteriormente, la representación del algoritmo es especificada en un nivel de abstracción inferior al dividirse en tareas más detalladas. Cada tarea del algoritmo es redefinida con mayor detalle hasta que la especificación completa es lo suficientemente concreta para validar el algoritmo. Considere el siguiente problema: Desarrolle un programa que calcule el promedio de calificaciones de una clase considerando un número arbitrario de calificaciones El algoritmo para el promedio de la clase se desarrollará mediante el enfoque descendente. Como se mencionó anteriormente, comenzamos con una representación en seudocódigo en un alto nivel de abstracción: 1.7.1. DR AF T Determinar el promedio de la clase; La descripción anterior es una instrucción individual que contiene la función general del programa. Sin embargo, contiene muy pocos detalles como para escribir un programa. 1: Nivel 1 A partir de una descripción general, usualmente muchos algoritmos se pueden dividir de manera lógica en tres fases: 1. Fase de inicialización que inicializa las variables del algoritmo. 2. Fase de procesamiento que introduce los valores de los datos y ajusta las variables del algoritmo de manera adecuada. 3. Fase de terminación que calcula y despliega los resultado finales. La observación anterior a menudo es todo lo que necesita para realizar el primer refinamiento. Comencemos con el proceso de refinamiento dividiendo la instrucción general en las tres fases anteriormente comentadas y las listamos en el orden que se deben ejecutar. El resultado del primer refinamiento es el siguiente: 1: 2: Inicializar las variables; Introducir las calif icaciones de la clase, sumarlas y contarlas; 30 CAPÍTULO 1. ALGORITMOS Calcular y despliegar el promedio de la clase; El refinamiento anterior utiliza unicamente la estructura de secuencia, es decir, que las instrucciones deben ejecutarse en orden una después de la otra. El proceso de refinamiento continua dividiendo las instrucciones en series de tareas mas pequeñas. Para continuar con el siguiente nivel de refinamiento se identifican las variables especificas. 3: 1.7.2. Nivel 2 DR AF T En este ejemplo, necesitamos una variable para recibir el valor de cada calificación conforme el usuario la introduce que denominamos calif icacion, una variable para almacenar la suma de las calificaciones denominada total, una variable que cuente el número de calificaciones denominada n y una variable para almacenar el promedio calculado denominada promedio. Las instrucciones en un nivel de abstracción inferior para la primera instrucción Inicializar las variables; son las siguientes: total = 0; n = 0; Observe que sólo las variables total y n deben inicializarse antes de que puedan utilizarse. Las variables calif icacion y promedio no necesitan inicializarse. Las instrucciones en un nivel de abstracción inferior para la instrucción Introducir las calif icaciones de la clase, sumarlas y contarlas; requiere una estructura de repetición que introduzca cada calificación. No sabemos por adelantado cuantas calificaciones se van a procesar por lo que utilizamos una estructura de control del tipo repetir mientras. Las instrucciones en un nivel de abstracción inferior para dicha instrucción son las siguientes: 1: 2: introducir(calif icacion); . posiblemente la bandera while calif icacion 6= −1 do . bandera total = total + calif icacion; . Acumulador n = n + 1; . Contador introducir(calif icacion); . posiblemente la bandera end while El usuario ingresa calificaciones una por una y después de introducir la ultima calificación, entonces el el usuario introduce un valor bandera (−1). 1.7. ENFOQUE DESCENDENTE 31 El algoritmo evalúa el valor de calif icacion después de la introducción de cada valor y termina el ciclo cuando el usuario digita el valor −1. Las instrucciones en un nivel de abstracción inferior para la instrucción Calcular y desplegar el promedio de la clase; son las siguientes: if n 6= 0 then propmedio = total/n; else N o hay calif icaciones; end if Observe que cuando se realiza una división entre una expresión cuyo valor pudiera ser cero, se debe evaluar de manera explicita esta posibilidad y hacerse cargo de ella de manera apropiada dentro del algoritmo (por ejemplo, despliegue un mensaje de error), en lugar de permitir que ocurra un error fatal. Un algoritmo en seudocódigo utilizando el enfoque descendente es terminado cuando esté especificado con suficientes detalles como para convertirlo en código de un lenguaje de programación. El algoritmo en seudcódigo 2 resuelve un problema general de promedios. Este algoritmo se desarrolló después de sólo dos niveles de refinamiento. Para algoritmos más complejos se requerirá más niveles de refinamiento y subdividirlos en más tareas. DR AF T 1: 2: 3: 4: 5: Algorithm 2 Calcula Promedio de Calificaciones 1: total = 0; 2: n = 0; 3: bandera = −1; 4: introducir(calif icacion); . posiblemente la bandera 5: while calif icacion 6= bandera do . bandera 6: total = total + calif icacion; . Acumulador 7: n = n + 1; . Contador 8: introducir(calif icacion); . posiblemente la bandera 9: end while 10: if n 6= 0 then 11: promedio = total/n; 12: else 13: N o hay calif icaciones; 14: end if 32 1.8. CAPÍTULO 1. ALGORITMOS Aplicando los Algoritmos DR AF T Para tomar decisiones racionales, necesitamos usar nuestra comprensión de la lógica de la toma de decisiones para rutinariamente hacer preguntas que mejoren la calidad de nuestras decisiones. Mediante nuestras preguntas, traemos el proceso de toma de decisiones a un nivel de opciones conscientes y deliberadas. Para el Pensamiento Computacional los algoritmos son considerados un práctica clave para poder formular problemas y aplicar soluciones de manera metódica y ordenada. Ahora que ha adquirido los conceptos básicos sobre algoritmos, piense en la forma que se encuentran presentes en su vida cotidiana y en su quehacer profesional. Sea creativo, analice el entorno que lo rodea, las personas, sus actividades o la naturaleza, e identifique donde se aplica el concepto de secuencia, el concepto de decisión o el concepto de repetición. Promueva su pensamiento lógico y algorı́tmico desde las actividades que tiene que realizar para preparase y asistir a la escuela o al trabajo, hasta para resolver un problema matemático complejo, o en la toma de decisiones que realiza en su lugar de trabajo. Con el tiempo, usted tendrá la habilidad para resolver complejos problemas a partir de ideas estructuradas. Bibliografı́a Bribiesca, E., Galaviz, J. y Rajsbaum, S.(2010), Computación, Enciclopedia de conocimientos Fundamentales 5 UNAM Siglo XXI, México: UNAM. DR AF T Deitel, H. M. y Deitel P. J. (1994), Como Programar en C/C++, Prentice Hall. Garcia, D., Algoritmos, Beauty and Joy of Computing, Fecha de consulta 25 de noviembre 2014 de: bjc.berkeley.edu, University of California, Berkeley. Wing, J.M. (2006), Computational thinking, Comm of ACM, 49 (3), (pp. 33-35). Cormen, T. H., Leiserson C. E., Rivest R. L. y Stein C. (1996), Introduction to Algorithms (2nd edición), MIT Press and McGraw-Hill. 33