Introducción a la Programación Prof. Yerson Rodríguez Flujo de control Transferencia de control El concepto de flujo de control de un programa se refiere al orden en que se ejecutan las acciones individuales de un programa. Aunque la secuencia de ejecución normal de un programa es lineal, existen métodos que permiten salir del flujo lineal a través del uso de las estructuras de control. Las estructuras de control se clasifican en: • Estructuras de control Selectivas. • Estructuras de control Repetitivas. 1 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control selectivo Sentencia If...then...else Dado que las expresiones lógicas toman el valor verdadero o falso, se necesita una sentencia de control que permita que se ejecuten ciertas instrucciones en caso de que una condición sea verdadera o que se ejecuten otras instrucciones en caso de que la condición no se cumpla y su evaluación sea falsa. En Pascal esa alternativa se realiza con la sentencia o estructura de control if-then-else. Unidad V Diagrama de flujo de la sentencia: if-then-else Condición Condición Acción A Acción A Acción B Acción B Pseudocódigo: Si expresión lógica entonces hacer acción A sino hacer Acción B Fin_si 2 Introducción a la Programación Prof. Yerson Rodríguez E. de control selectivo Sentencia If...then...else Reglas de Funcionamiento. 1. Se evalúa la expresión lógica. 2. Si el resultado anterior arroja true (verdadero), se ejecutará la acción A, y el control pasa a la sentencia siguiente a la condición if-then-else (no se ejecuta la acción B). 3. Si el resultado da falso, se ejecuta entonces, la acción B. El control pasa luego a la siguiente sentencia del programa sin pasar por la acción A. Diagrama de flujo de la sentencia: if-then-else Condición Condición Acción A Acción A Acción B Acción B 3 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia If...then...else program numeros; uses crt; var numero: real; begin WriteLn (‘Introduzca un número: ‘); ReadLn (numero); if numero > 0.0 then WriteLn (‘El número es positivo ‘) else WriteLn (‘El número es negativo ‘); WriteLn (‘Siempre pasará por aquí... ‘) end. {archivo ifthenel} Unidad V Programa que solicita se ingrese un número por el teclado y luego da un mensaje en pantalla indicando si este es positivo o negativo. Ejecución: Introduzca un número: 9↵ El número es positivo Siempre pasará por aquí... 4 Introducción a la Programación Prof. Yerson Rodríguez Sentencia If...then...else Sangrado (indentación). Omisión del else. Sintácticamente, el sangrado y la separación de líneas no son necesarias. Por ejemplo el compilador aceptará las siguientes sentencias. En determinados casos se desea que una determinada acción sólo se ejecute si una cierta condición es verdadera y no realizar ninguna acción si la condición es falsa, en ese caso se omite del formato la utilización de la cláusula else. ReadLn (numero); if numero > 0.0 then WriteLn (‘positivo‘) else WriteLn (‘negativo‘); WriteLn (‘Siempre pasará por aquí... ‘); Sin embargo, las sangrías favorecen la legibilidad de los programas, por ello es muy recomendado. Pseudocódigo: Si expresión lógica entonces hacer acción A Fin_si 5 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Sentencia If...then...else Sentencias Compuestas. En numerosas ocasiones en lugar de realizar sólo una acción, cuando se cumpla o no se cumpla una determinada condición, se desea realizar varias acciones. Esto se realiza mediante sentencias compuestas. Una sentencia compuesta es un conjunto de sentencias separadas por puntos y comas y encerradas entre las palabras begin y end. El cuerpo de un programa o procedimiento es una sentencia compuesta. Unidad V begin sentencia 1; sentencia 2; sentencia 3; sentencia 4; : : sentencia n end; El punto y coma de una sentencia anterior al end final de if es opcional y se suprime casi siempre. 6 Introducción a la Programación Prof. Yerson Rodríguez IF anidadas Sentencia If...then...else Sentencias if anidadas La sentencia que sigue a la palabra reservada then o else puede ser cualquiera, incluso otra sentencia if...then...else. Cuando una o ambas bifurcaciones de una sentencia if...then...else contienen también una sentencia if...then...else, se dice que dichas sentencias if están anidadas, y al proceso general se le llama anidamiento. Una sentencia if anidada se puede utilizar para construir decisiones con diferentes alternativas. Suelen usarse cuando se requiere evaluar varias condiciones lógicas sucesivamente unas detrás de otras. En el programa cada condición que sucesivamente se evalué estará dentro de la condición anterior, ósea unas dentro de otras. 7 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Ejemplo program Mayor; var a, b, c : integer; num-mayor : integer; begin WriteLn (‘Introduzca tres números enteros ‘); ReadLn (a, b, c); if a > b then if a >c then num-mayor := a; else num-mayor := c; else if b > c then num-mayor := b; else num-mayor := c; WriteLn (El número mayor es ‘, num-mayor) end. {archivo mayor} Unidad V Programa que solicita tres números enteros distintos y luego muestra el mayor de ellos, usando para ello estructuras if anidadas. Ejecución: Introduzca tres números enteros 15 23 19 ↵ El número mayor es 23 8 Introducción a la Programación Prof. Yerson Rodríguez E. de control selectivo Sentencia Case...of...else...end La estructura de control case...of...else...end se utiliza para elegir entre diferentes alternativas. Una sentencia case se compone de varias sentencias simples. Cuando case se ejecuta, una (y solo una vez) de las sentencias simples se selecciona y ejecuta. Case selector of Lista constantes 1: sentencia 1; Lista constantes 2: sentencia 2; Lista constantes 3: sentencia 3; . . . Lista constantes n: sentencia n Else (*Opcional *) Sentencia z; End (* fin de la sentencia case*) 9 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control selectivo Sentencia Case...of...else...end Reglas de Funcionamiento. 1. 2. 3. 4. 5. 6. Unidad V La expresión selector se evalúa y se compara con las listas de constantes; las listas de constantes son listas de uno o más posibles valores que puede tomar selector separadas por comas. Solo se ejecuta una sentencia. Si el valor del selector esta en la lista de constantes 1, entonces se ejecutará la sentencia 1. Luego el programa se seguirá ejecutando a partir del end. Cada sentencia puede ser una sentencia simple o compuesta. La cláusula else es opcional y funciona igual que en la sentencia IF. Si el valor de selector no está comprendido en ninguna lista de constantes y no existe la cláusula else, no sucede nada y el programa se seguirá ejecutando a partir del end. En caso de que exista la cláusula else, pero el valor de selector no coincide con ninguna de las listas de constantes, se ejecutarán las sentencias a continuación de la cláusula else. El selector debe ser de tipo ordinal (integer, char, boolean o enumerado). No se pueden usar números reales dado que no son ordinales. Todas las constantes case deben ser únicas y de tipo ordinal compatibles con el tipo del selector. Cada sentencia, excepto la última debe ir seguida de un punto y coma. 10 Introducción a la Programación Prof. Yerson Rodríguez Ejemplo program adivinanza (imput, output); const impar = 0; par = 1; var digito, paridad, mod5, sudigito, : integer; begin WriteLn (‘Escriba un digito secreto entre 0 y 9 ‘); WriteLn (‘Introduzca 0 si es impar 1 si es par‘); ReadLn (paridad); WriteLn (‘Indique el resto de dividir su digito entre 5’); ReadLn (mod5); case paridad of par : case mod5 of 0: sudigito := 0; 1: sudigito := 6; 2: sudigito := 2; 3: sudigito := 8; 4: sudigito := 4; end; impar : case mod5 of 0: sudigito := 5; 1: sudigito := 1; 2: sudigito := 7; 3: sudigito := 3; 4: sudigito := 9; end; end; WriteLn (‘El digito que escribió es ‘, sudigito) end. {archivo caseadiv} Programa que solicita indicar si un número secreto es par o impar, además solicita el resto de dividirlo entre 5. Luego el programa le dice cual fue el número que escribió. Ejecución: Escriba un número secreto entre 0 y 9 Introduzca 0 si es impar y 1 si es par 0↵ Indique el resto de dividirlo entre 5 3↵ El digito que escribió es 8 11 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia for...to...do En numerosas ocasiones se puede desear un bucle que se ejecute un número determinado de veces, y cuyo número se conozca por anticipado. Para aplicaciones de este tipo se utiliza la sentencia for...to...do. La sentencia for...to...do requiere que conozcamos por anticipado el número de veces que se ejecutan las sentencias del interior del bucle. Si se desea que las sentencias controladas se ejecuten hasta que ocurra una determinada situación, no se debe utilizar la sentencia for. Unidad V Diagrama de flujo de la sentencia: for...to...do Ciclo Ciclo Acción A Acción A Pseudocódigo: Desde i ← valor inicial hasta valor final hacer sentencia(s) Fin_desde 12 Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia for...to...do program sumar; const max = 100; var numero, suma : integer; Programa que suma todos los enteros entre 1 y 100 y muestra el resultado por pantalla. begin suma := 0; for numero := 1 to max do suma := suma + numero; write (‘La suma de los ‘,max,’ primeros ‘); writeln (‘números es igual a ‘); write (suma) end. 13 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia for...to...do program sumador; var i, numero, cant, suma : integer; begin writeln ('Cuantos números desea sumar?'); readln (cant); suma := 0; for i := 1 to cant do begin write ('Introduzca N°', i ,': '); readln (numero); suma := suma + numero end; write ('La suma de los ', cant,' números '); write ('introducidos es igual a: '); write (suma) end. {archivo forsuma} Unidad V Programa que solicita la cantidad de números que se desea sumar y luego muestra por pantalla la suma de estos. Ejecución: Cuantos números desea sumar? 3↵ Introduzca N° 1: 5 ↵ Introduzca N° 2: 4 ↵ Introduzca N° 3: 6 ↵ La suma de los 3 números introducidos es igual a: 15 14 Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia for...downto...do La sentencia de control repetitivo for...downto...do es una variante de la sentencia for...to...do. Diagrama de flujo de la sentencia: for...downto...do Su funcionamiento es similar, lo que varía es que en lugar de incrementar en una unidad al contador, este se decrementa en una unidad. Ósea que este tipo de ciclo o bucle se ejecutará repetidamente desde un valor inicial “mayor” hasta un valor final “menor” descontándose una unidad del contador cada vez. Ciclo Ciclo Acción A Acción A Pseudocódigo: Desde i ← valor final hasta valor inicial hacer sentencia(s) Fin_desde 15 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia for...to/downto...do Reglas de Funcionamiento. 1. Las variables de control, valor inicial y valor final deben ser todas del mismo tipo, pero el tipo real no esta permitido. Los valores iniciales o finales pueden ser tanto expresiones como constantes. 2. Antes de la primera ejecución del bucle, a la variable de control se asigna el valor inicial. 3. La última ejecución del bucle normalmente ocurre cuando la variable de control es igual al valor final. 4. Cuando se utiliza la variable reservada to la variable de control se incrementa en cada iteración. Si por el contrario se utiliza downto, entonces se decrementa. 5. Es ilegal intentar modificar el valor de la variable de control, el valor inicial y el valor final dentro del bucle. Unidad V Diagrama de flujo de: for...to/downto...do Ciclo Ciclo Acción A Acción A 16 Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia for...downto...do program sumador; var i, numero, cant, suma : integer; begin writeln ('Cuantos números desea sumar?'); readln (cant); suma := 0; for i:= cant downto 1 do begin write ('Introduzca N°', i ,': '); readln (numero); suma := suma + numero end; write ('La suma de los ', cant,' números '); write ('introducidos es igual a: '); write (suma) end. {archivo fordsum} Programa que solicita la cantidad de números que se desea sumar y luego muestra por pantalla la suma de estos. Ejecución: Cuantos números desea sumar? 3↵ Introduzca N° 3: 5 ↵ Introduzca N° 2: 4 ↵ Introduzca N° 1: 6 ↵ La suma de los 3 números introducidos es igual a: 15 17 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia while...do La sentencia while...do es aquella donde el número de iteraciones no se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta lo primero que sucede es la evaluación de la expresión lógica. Si se evalúa falso, ninguna acción se realiza y el programa sigue con la siguiente sentencia después del bucle. Si la expresión se evalúa y resulta verdadero, entonces se ejecuta el cuerpo del bucle y se evalua de nuevo la expresión. Unidad V Diagrama de flujo de la sentencia: while...do Condición Condición Acción A Acción A Pseudocódigo: Mientras condición hacer sentencia(s) Fin_mientras 18 Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia while...do Diagrama de flujo de: while...do Reglas de Funcionamiento. 1. La condición se evalúa antes y después de cada ejecución del bucle. Si la condición es verdadera se ejecuta el bucle, si es falsa, el control pasa a la siguiente sentencia sin pasar por el bucle. 2. Si la condición se evalúa a falso cuando se ejecuta el bucle por primera vez, las sentencias dentro del bucle no se ejecutarán nunca. 3. Mientras la condición sea verdadera el bucle se ejecutará. Esto significa que el bucle se ejecutará indefinidamente a menos que “algo” dentro del bucle modifique la condición haciendo que su resultado sea falso y se salga del bucle. Si la expresión nunca cambia de valor, entonces el bucle no se para nunca y se dice que es un bucle infinito. Condición Condición Acción A Acción A 19 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia while...do program sumador; var i, numero, cant, suma : integer; begin writeln ('Cuantos números desea sumar?'); readln (cant); suma := 0; i := 1; while i <= cant do begin write ('Introduzca N°', i ,': '); readln (numero); suma := suma + numero; i := i + 1 end; write ('La suma de los ', cant,' números '); write ('introducidos es igual a: '); write (suma) end. {archivo whilesum} Unidad V Programa que solicita la cantidad de números que se desea sumar y luego muestra por pantalla la suma de estos. Ejecución: Cuantos números desea sumar? 3↵ Introduzca N° 1: 5 ↵ Introduzca N° 2: 4 ↵ Introduzca N° 3: 6 ↵ La suma de los 3 números introducidos es igual a: 15 20 Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia repeat...until La estructura de control repetitivo repeat...until es una variante del bucle while...do y especifica un bucle condicional que se repite hasta que la condición se hace verdadera. Después de cada iteración del cuerpo del bucle se evalúa la condición. Si la condición es verdadera, el bucle termina y sale de él, ejecutándose la siguiente sentencia después del bucle. Si la condición es falsa se repite el cuerpo del bucle nuevamente. Diagrama de flujo de la sentencia: repeat...until Acción A Acción A Condición Condición Pseudocódigo: Repetir sentencia(s) Hasta_que condición 21 Unidad V Introducción a la Programación Prof. Yerson Rodríguez E. de control repetitivo Sentencia repeat...until Reglas de Funcionamiento. 1. La condición (expresión lógica) se evalúa al final del bucle, después de que se ejecutan todas las sentencias del cuerpo del bucle. 2. Si la expresión lógica es verdadera, se vuelve a repetir el cuerpo del bucle y se ejecutan todas las sentencias. 3. Si la expresión lógica es falsa, se sale del bucle y se ejecuta la siguiente sentencia posterior a until. 4. La sintaxis de la sentencia repeat...until no requiere begin ni end. Unidad V Diagrama de flujo de repeat...until Acción A Acción A Condición Condición 22 Introducción a la Programación Prof. Yerson Rodríguez Ejemplo Sentencia repeat...until program sumador; var i, numero, cant, suma : integer; begin writeln ('Cuantos números desea sumar?'); readln (cant); suma := 0; i := 1; repeat write ('Introduzca N°', i ,': '); readln (numero); suma := suma + numero; i := i + 1 until (i > cant); write ('La suma de los ', cant,' números '); write ('introducidos es igual a: '); write (suma) end. {archivo repeatsu} Programa que solicita la cantidad de números que se desea sumar y luego muestra por pantalla la suma de estos. Ejecución: Cuantos números desea sumar? 3↵ Introduzca N° 1: 5 ↵ Introduzca N° 2: 4 ↵ Introduzca N° 3: 6 ↵ La suma de los 3 números introducidos es igual a: 15 23 Unidad V Introducción a la Programación Prof. Yerson Rodríguez Bibliografía Joyanes A., Luis, Programación en Turbo/Borland Pascal 7. 3ra Ed. Osborne/McGrawHill Interamericana, Madrid, 1998 Rodnay, Zaks, Programación en Pascal, Turbo Pascal. 1ra Ed. Anaya Multimedia, Madrid, 1986 Joyanes A., Luis, Turbo/Borland Pascal 7. 1ra Ed. Osborne/McGraw-Hill Interamericana, Madrid, 1997 Noton, Peter. Introducción a la Computación. 3ra Edición. México. McGraw-Hill Interamericana, México, D.F., 2003. Prieto E., Alberto y otros, Introducción a la Informática. 3da Ed. McGraw-Hill Interamericana, Madrid, 2002 Mata T., Ramón, Cushman, Pauline, Introducción a la Programación. 1ra Ed. McGrawHill Interamericana, México, D.F., 2001 Unidad V 24