Estructuras de Control Lissette Alvarez Abril-Julio, 2004 1 Estructura general de un programa Un programa puede considerarse como una secuencia de acciones (instrucciones) que manipulan un conjunto de datos para que realice una tarea específica. En general, un programa está formado por dos bloques: 1. Bloque de declaraciones. En este bloque se especifican todos los objetos que utilizará el programa (constantes, variables, tablas, registros, archivos, etc.). Las declaraciones se utilizan en aquellos lenguajes de programación que no tienen declaración explícita de los objetos. Su misión consiste en indicar al procesador que reserve espacio en la memoria para un objeto del programa, indicando asimismo su nombre, tipo y características. 2. Bloque de instrucciones. Lo constituye el conjunto de operaciones y la secuencia de instrucciones que se han de realizar para la obtención de los resultados deseados. Dentro de éste bloque se diferencian tres partes fundamentales: (a) Entrada de datos: conformada por todas las instrucciones que toman datos de un dispositivo externo, almacenándolos en la memoria central para que puedan ser procesados. (b) Proceso: formado por las instrucciones que modifican/procesan los datos, dejando éstos disponibles en la memoria central. (c) Salida de resultados: conjunto de instrucciones que toman los datos finales de la memoria central y los envían a los dispositivos externos. A fin de facilitar los cómputos y la programación, Octave/Matlab tiene declaración explícita de objetos, siendo posible prescindir del bloque de declaraciones. En consecuencia, los algoritmos estudiados en este curso sólo desarrollarán el bloque de instrucciones. Las instrucciones pueden ser: 1
1. básicas (primitivas). Las instrucciones básicas son aquellas que ejecuta el procesador de modo inmediato. Las principales son asignación, entrada y salida: (a) Instrucción de asignación: consiste en calcular/indicar el valor de una expresión y almacenarlo en una variable 1. (b) Instrucción de entrada: toma un dato de un dispositivo de entrada y lo almacena en una variable. (c) Instrucción de salida: toma el valor de una expresión o variable y lo lleva a un dispositivo externo. 2. de control. Este tipo de instrucciones controlan la ejecución de otras instrucciones. Existen varios tipos: (a) Selectivas (alternativas): controlan la ejecución de unas u otras instrucciones según una condición. (b) Saltos: alteran la secuencia normal de ejecución de un programa únicamente en el caso de cumplimiento de una condición asociada a la propia instrucción (c) Iterativas: repiten, un número finito de veces, una o varias instrucciones. 3. compuestas. Son aquellas que el procesador no puede ejecutar directamente, sino que realiza una llamada a un subprograma, subrutina o párrafo. 1.1 Pseudocódigo Es un lenguaje de especificación de algoritmos muy parecido a la mayoría de los actuales lenguajes de programación, lo que facilita su traducción al lenguaje en sí. El pseudocódigo utilizar unas pocas palabras clave o palabras especiales que indican la evolución del algoritmo. El pseudocódigo tiene algunas ventajas sobre otras técnicas de diseño de algoritmos: La modificación es muy sencilla si nos equivocamos en la lógica del programa Es independiente del lenguaje de programación que se utilice: un algoritmo escrito en pseudocódigo es fácilmente traducible a muchos lenguajes de programación. 1 Variable: objeto que almacena valores o datos que pueden cambiar durante la ejecución del programa. Ocupa espacio en memoria, por lo tanto, se localiza en una posición de memoria y tiene asociado un nombre (identificador) que se utiliza en lugar de la posición de memoria. 2
2 Instrucciones Básicas 2.1 Inicio y Fin Delimitan el comienzo y el final de un algoritmo, de la siguiente manera: Inicio. ALGORITMO. fin También, en vez de inicio y fin se puede utilizar empezar y fin, pero siempre quedando clara la intención. En Octave/Matlab las palabras inicio y fin deben ser colocadas a modo de comentarios, para una buena documentación: %Inicio. %Fin 2.2 Asignaciones Cuando se quiere asignar un valor a una variable, la asignación se ajusta al siguiente patrón: variable valor o expresión Ejemplo 2.1. I 3 x 5ˆ(1/2) z y + 1 Observaciones: La parte izquierda de la asignación siempre es una variable. Las expresiones representan operaciones que pueden evaluarse. 3
En Octave/Matlab las asignaciones tienen la misma sintaxis, cambiando el símbolo por =. asignaciones del ejemplo se implementarían de la siguiente manera: Las I = 3; x = 5ˆ(1/2); z = y + 1; 2.3 Lectura Una acción de lectura se ajusta al siguiente patrón: LEER(variable) Ejemplo 2.2. LEER(x) LEER (x, matriza) Observaciones: El argumento de la acción LEER siempre debe ser una variable. Se pueden leer varios datos, colocando la lista de variables separadas por comas. El valor leído se almacena directamente en la variable que se indica. La acción LEER es otra forma de dar valor a una variable. La implementación de la instrucción LEER en Octave/Matlab depende, básicamente, del dispositivo desde donde se leerá la variable. Si el valor es ingresado por el usuario a través del teclado el comando correspondiente es input: x = input( texto ); Entre las comillas debe escribirse un texto que indique claramente al usuario la información que debe introducir. Si el valor debe leerse de un archivo en formato ASCII (por ejemplo) se utiliza el comando load con la sintaxis load nombre archivo. En sesiones posteriores estudiaremos este comando más a fondo. 4
2.4 Escritura Una acción de escritura se ajusta al siguiente patrón: ESCRIBIR(variable o expresión) Ejemplo 2.3. ESCRIBIR(x) ESCRIBIR(x + y) Observaciones: El argumento de la acción ESCRIBIR puede ser una variable o expresión. Se pueden escribir varias expresiones, señalando la lista de expresiones separadas por comas. Los comandos deoctave/matlab que corresponden a la acción ESCRIBIR son, entre otros, disp y fprintf 2. Los ejemplos serían implementados de la forma: disp(x); fprintf( El resultado es %1.5d,x+y); Ejemplo 2.4. Elabore el algoritmo de un programa que convierta grados a radianes. Inicio LEER(grados) radianes grados / 180 ESCRIBIR (radianes) FIN La implementación en Octave/Matlab correspondería a: % Inicio grados = input( Introduzca el valor de los grados ); radianes = grados / 180; disp(radianes); % FIN 2 En la ventana de comandos e Octave/matlab teclee help disp o help fprintf para obtener mayor información acerca de estas instrucciones 5
Problemas Propuestos 2.5. Para los siguientes planteamientos elabore el algoritmo e implemente el programa en Octave/Matlab. 1. Solicite al usuario dos números, A y B, y muestre el resultado de elevar A a B. 2. Calcule la longitud de la circunferencia que tenga por radio un número introducido por el usuario. 3. Intercambie el valor de dos variables numéricas.* 4. Dada una cantidad en grados, determine el número de vueltas y el ángulo correspondiente en el círculo trigonométrico. Grados = 390 Vueltas = 1 Ángulo = 30 5. Dada una cantidad (válida) de días, determine su equivalente en años y meses. Asuma que todos los años tienen 365 días y los meses 30. 6. Dadas las pendientes M1 y M2 y los cortes con el eje Y B1 y B2 de dos rectas L1 y L2 (L1: Y = M1 X + B1; L2: Y = M2 X + B2), determine en punto de intersección entre las dos rectas. Asuma que M1 M2. 7. Determinar el área de la base y el volumen de un cilindro conocidos su radio y su altura. 8. Calcule el área de un triángulo en función de las longitudes de sus lados. (Si a, b, c son las longitudes de los lados de un triángulo, su área viene dada por la expresión A = p (p a) (p b) (p c) donde p = a+b+c 2. 9. Realice la conversión de grados Celsius ( o C) a grados Fahrenheit ( o F ). Cómo sería el algoritmo que realizase la conversión contraria, es decir, de o F a o C?. expresión F = 9 5 C + 32 10. Convertir coordenadas cartesianas en esféricas y viceversa. La fórmula de conversión viene dada por la 6
3 Estructuras de Control Las estructuras de control tienen una finalidad bastante definida: señalar orden en que tienen que sucederse los pasos de un algoritmo. Si un programa muestra un mensaje en la pantalla que pregunta al usuario Desea seguir adelante?, obviamente, de la respuesta del usuario dependerá la siguiente acción del programa. El programador debe escribir el código para las dos posibilidades (sí y no), aunque cuando el programa esté funcionando, sólo se elegirá una. 3.1 Selectivas Las estructuras selectivas se utilizan para tomar decisiones (por eso también se llaman estructuras de decisión o alternativas). El mecanismo de acción evalúa una condición, y, a continuación, en función del resultado, se lleva a cabo una opción u otra. Es importante asentar esta idea: el programa está diseñado para evaluar una condición, y actuar en consecuencia, según que la condición sea verdadera o falsa. 3.1.1 Selección Simple Si... entonces... Se evalúa una condición y si ésta resulta verdadera entonces se ejecuta una o varias instrucciones. La sintaxis básica es: SI (condición) entonces instrucciones F INSI Es importante cerrar el SI (FINSI), ya que, si no se cumple la condición, el programa continua en la instrucción que sigue a FINSI. Ejemplo 3.1. Se desea calcular la raíz cuadrada de un número, de forma que tras leer el número introducido por el usuario, es necesario validarlo, -esto es, verificar que cumple las hipótesis-. En nuestro caso, hay que verificar que el número sea no negativo. INICIO LEER ( numero ) SI (numero 0) entonces 7
raíz = numero FINSI ESCRIBIR (raiz) FIN En Octave/Matlab la instrucción que corresponde a las alternativas simples es IF (condición)... END. En el caso de Octave también es válida la instrucción. IF (condición)... ENDIF. 3.1.2 Selección Doble. Si... entonces... sino.... Lo más frecuente es encontrar situaciones donde si una condición se cumple se ejecuta un grupo de instrucciones, pero si no se cumple, deben ejecutarse otras. La instrucción Si... entonces... Sino... facilita este tipo de programación. La estructura que le corresponde es: SI (condición) entonces instrucciones 1 SINO instrucciones 2 F INSI Con esta estructura puede mejorarse el algoritmo del ejemplo anterior, señalando error si el usuario ingresa valores negativos. Ejemplo 3.2. Se desea calcular la raíz cuadrada de un número... INICIO LEER ( numero ) SI (numero 0) entonces raíz = numero SINO ESCRIBIR ( Error. Debe ingresar valores positivos! ) FINSI ESCRIBIR (raíz) FIN 8
El comando de alternativas dobles para Octave/Matlab IF (condición)... ELSE... END.. En el caso de Octave también es válida la instrucción. IF (condición)... ELSE... ENDIF. 3.1.3 Selección Múltiple También hay programas que nos llevan a considerar alternativas con varias opciones posibles. Hay dos formas de escribir esto en pseudocódigo. La primera de ellas modifica la estructura de selección doble: SI (condición1) entonces intrucciones 1 SI (condicion2) entonces. instrucciones 2 SI (condicion k) entonces F INSI instrucciones k La instrucción IF(condicion1) instrucciones 1 ELSEIF(condicion2) instrucciones 2... ELSEIF(condicion K) instrucciones k END. corresponde a selecciones multiples en Octave/Matlab. podemos intercambiar END por ENDIF. Nuevamente, el ambiente Octave La segunda: OPCION es particularmente útil cuando se elabora un menú. La OPCION toma distintos valores y según la respuesta del usuario ejecuta las acciones bajo dicha opción. LEER (opcion) 9
OPCION (valor 1): intrucciones 1 (valor 2): instrucciones 2 : (valor k): instrucciones k {las acciones que toque} en otro caso instrucciones k + 1 FINOPCION La opción en otro caso no es más que una alternativa en caso que ell usuario seleccione alguna opción no contemplada entre las que se ofrece. Ejemplo 3.3. El usuario ingresa dos valores y se desea elaborar un menu cuyas opciones sean calcular multiplicación, division de ambos números y salir del programa. Asuma que el segundo número siempre es distinto de cero. Inicio ESCRIBIR (Ingrese dos numeros: ) LEER (x, y) ESCRIBIR (Menu de opciones.) ESCRIBIR (1. Multiplicacion.) ESCRIBIR (2. Division.) ESCRIBIR (3. Salir del programa.) LEER(opcion) OPCION 1: mult = x y ESCRIBIR (mult) 2: div = x/y ESCRIBIR (div) 10
3: SALIR en otro caso: ESCRIBIR (Debe escoger una opción entre 1 y 3) FIN OPCION En Octave/Matlab la instrucción que corresponde a OPCION es SWITCH (expresión) case (valor 1) instrucciones 1 case(valor2) instrucciones 2 : otherwise instrucciones end La implementación del ejemplo anterior sería: % Inicio x=input( Por favor ingrese un numero ); y=input( Ingrese un numero distinto de cero ); disp( Menu de opciones ); disp(1. Multiplicación.); disp(2. Division.); disp(3. Salir del programa.); opcion=input(seleccione una opción ); SWITCH (opción) case 1: mult = x y; disp (mult) case 2: div = x/y disp (div) case 3: 11
end otherwise break; disp( Seleccione una opción entre 1 y 3 ) 3.2 Repetitivas Las estructuras repetitivas, que también reciben el nombre de bucle (loop, en inglés) controlan un conjunto de instrucciones que deben repetirse cierto número de veces, mientras se cumple una condición que ha de ser claramente especificada. La condición podrá ser verdadera o falsa, y se comprobará en cada paso o iteración del bucle. Todo bucle consta de tres partes básicas, a saber: Decisión: donde se evalúa la condición y, en caso de ser cierta, se ejecuta el cuerpo del bucle. Cuerpo del bucle: son las instrucciones que se ejecutarán repetidamente, un número determinado de veces, cuando la decisión es verdadera. Salida del bucle: es la condición que indica cuándo terminan las iteraciones. Básicamente, existen tres tipos de estructuras repetitivas: 1. Mientras... (while), 2. Repetir... hasta... (do... until) 3. Desde (for). Una forma de controlar un bucle es mediante una variable llamada contador cuyo valor se incrementa o decrementa en una cantidad constante en cada repetición que se produzca. También, los bucles suelen utilizar otro tipo de variables llamadas acumulador, cuya misión es almacenar una cantidad variable resultante de operaciones sucesivas y repetidas. Es como un contador, con la diferencia que el incremento/decremento es variable. 12
3.2.1 MIENTRAS (while) En este tipo de estructura, el cuerpo del bucle se repite MIENTRAS se cumple una determinada condición. La sintaxis básica es: M IEN T RAS (condición - expresión lógica) hacer instrucciones F INMIENT RAS Ejemplo 3.4. Dado un número entero N calcular la suma de todos los números entre 1 y N.. INICIO LEER(N) I 1; SUMA 0 MIENTRAS (I N) SUMA SUMA + I; I I + 1; FINMIENTRAS FIN Frecuentemente se utiliza el bucle while para validar los datos de entrada de un programa. siguiente: Veamos el Ejemplo 3.5. Solicitar al usuario un valor positivo y validarlo. INICIO LEER(x) Contador 0; MIENTRAS (x < 0) hacer LEER(x) Cont Cont + 1 FINMIENTRAS FIN En los ejemplos las la variable I y Cont son contadores y la variable SUMA es un acumulador. cree Ud. que pasaría si se omitiera la línea I I + 1 en del cuerpo del bucle? Qué Observaciones: 13
Ya que primero se comprueba la condición y luego se ejecuta el cuerpo del bucle, esta construcción implica que el cuerpo del bucle puede realizarse 0, 1 ó más veces. La estructura correspondiente en Octave/Matlab es: while (condición) instrucciones end La implementación de ambos ejemplos queda como sigue: Ejemplo 3.4 %Inicio x=input( Por favor, ingrese el valor de x: ); Cont=0; suma=0; while (x<0) disp( Es necesario que el valor de x sea positivo. ); x=input( Por favor, ingrese el valor de x: ); Cont = Cont+1; end Ejemplo 3.5 %Inicio N=input( Por favor, ingrese un valor para N: ); i=1; suma=0; while (i<=n) suma = suma + i; i = i+1; end 14
3.2.2 DESDE (for) El bucle for permite repetir un conjunto de instrucciones un número determinado de veces, con la peculiaridad que la instrucción incrementa (o decrementa), automáticamente y de uno en uno, la variable que se utiliza como contador. La sintaxis básica es: DESDE < valor inicio > : < valor final > HACER instrucciones F INDESDE o DESDE < valor inicio > : < decremento > : < valor final > HACER instrucciones F INDESDE El incremento es opcional. Si no se coloca, el bucle aumenta de uno en uno -de forma automática- el valor del contador. Si se desea decrementar la variable es necesario colocar el valor del decremento ( 1). Retomando el ejemplo 3.4: INICIO LEER(N) SUMA 0 DESDE I = 1 : N SUMA SUMA + I; FINDESDE FIN Observaciones: El contador siempre se inicializa -automáticamente- en el valor inicial indicado en la estructura. El comando de Octave/Matlab para esta estructura es: for contador = inicio : espaciado : fin end instrucciones 15
El programa en Octave/Matlab para el ejemplo es: %Inicio N=input( Por favor, ingrese un valor para N: ); suma=0; for i=1:n suma = suma + i; end 3 IMPORTANTE: Las estructuras no utilizan ; al final de la línea!!! 3.3 Saltos Otro tipo de instrucciones nos permiten salir de un bucle en ejecución o ir al ciclo siguiente sin terminar el actual. La instrucción break detiene la ejecución de un bucle while y for. Debe escribirse -únicamente- en el cuerpo del bucle. Octave/Matlab ejecuta la instrucción que se encuentra inmediatamente después del bucle y continua el programa. La instrucción continue salta las instrucciones siguientes del bucle -en un paso k, digamos-y continua con la siguiente iteración -paso k+1 del bucle-. Debe escribirse en el cuerpo del bucle y se utiliza sólo en estructuras iterativas. 3 En Octave pueden utilizarse, alternativamente, las palabras endfor, endif y endwhile para cerrar los ciclos for, if y while respectivamente. 16
4 Bucles Anidados Es posible construir un programa donde se aniden los bucles; esto es, ejecutar un bucle dentro de otro, siempre que el bucle interno esté totalmente contenido dentro del bucle externo, si no, el algoritmo no es válido. El caso típico de bucle anidado es la asignación de valores a una matriz. Supongamos que se desea leer los valores de una matriz de orden mxn. (m y n dados por el usuario). El pseudocódigo que resuelve el planteamiento es: INICIO HACER LEER(m, n) HASTA QUE ((m > 0) & (n > 0)) DESDE i = 1 : m HACER DESDE j = 1 : n HACER LEER A(i, j) FINDESDE -j- FINDESDE -i- FIN Y la implementación correspondiente: %Inicio do m=input( Por favor introduzca el número de filas: ); n=input( y el número de columnas: ); until ((m > 0) & (n > 0)) disp( Introduzca los valores por filas. ); for i = 1 : m for j = 1 : n A(i,j)=input( ); end end %Fin 17
5 Problemas propuestos Para los siguientes planteamientos elabore el algoritmo el implemente el programa en Octave/Matlab. 1. Indique si la suma de dos números introducidos por teclado es mayor que un tercer número, también introducido por teclado. 2. Calcule las raíces de un polinomio de segundo grado. 3. Redondee un número al número entero más cercano. 4. Dados n numeros cuente la cantidad de numeros positivos, negativos y cero. 5. Escribir un programa que, tras pedir al usuario un número, le informe de si es par, impar o no entero. 6. Dados tres números reales determine el mayor y el menor de ellos. 7. Dados dos números reales, A y B, determine (sin realizar la operación aritmética) el signo de la suma, el producto y la resta de A+-*B. 8. Determine si un año es o no bisiesto. Son bisiestos los años que sean múltiplos de 4, salvo los que finalizan en 00, que sólo lo serán cuando también sean múltiplos de 400. 9. Determine al valor absoluto de un número ingresado por el usuario. 10. Dos números reales LS y LI que representan los límites superior e inferior de un intervalo, respectivamente. Dado un número n determine si dicho número pertenece al intervalo. En caso contrario, indique si está a la derecha o izquierda del intervalo. 11. Pedir un número al usuario y mostrar su tabla de multiplicar del 1 al 10. 12. Mostrar los mil primeros números pares. (utilizando while y for) 13. Escribir un programa que calcule las N primeras fracciones del tipo 1 i, i = 1, 2,..., N, tras pedir N al usuario. 14. Escribir un programa que calcule los cuadrados de los números enteros, hasta que el cuadrado sea mayor o igual que 2100. 15. Evalúe las siguientes expresiones, donde i y n son dados por el usuario: (a) n 1 i i=1 18
(b) (c) (d) (e) (f) (g) (h) n x2 4 i=1 n i=1 ( n 3x 2 2x+8 x 2 16 1 n+i i=1 n i=1 n i=1 n i=1 ( log ) log (n) ( 2 i+1 2 i i+1 i+1 i 1 ( 1) i+1 1 2 i n n (n + 1) i=1 ) i ) 16. Calcule el factorial de un número. 17. Dados dos números, escriba su multiplicación y luego pregunte si quiere repetir el proceso. 18. Lea un vector de orden n y calcule su norma euclídea. La norma euclídea de un vector x = (x 1, x 2,...x n ) viene dada por la fórmula (x 1 ) 2 + (x 2 ) 2 + + (x n ) 2 19. Convertir un número entero dado en base 10 a base binaria. 20. Calcule los n primeros números de la serie Fibonacci. La serie de Fibonacci se genera de la siguiente manera: F 0 = 1 F 1 = 1 F n = F n 1 + F n 2 ; n 2 21. Para una matriz A, cuadrada, de 10 x 10 elementos, muestre los siguientes resultados: (a) Número de elementos distintos de cero. (b) La suma de los elementos situados encima de la diagonal principal, es decir, los elementos A(i, j) tales que i < j. (c) El producto de los elementos de la diagonal principal (A(1, 1) A(2, 2) A(10, 10)). 22. Dada una secuencia de N números enteros determine: 19
(a) Cantidad de números positivos (b) Suma de los números positivos (c) Promedio de los números positivos (d) Cantidad de números negativos (e) Suma de los números negativos (f) Promedio de números negativos 23. Dado un número indique si es o no primo. 24. Dada una matriz de orden mxn determine (a) Suma de los elementos de cada fila. (b) Suma de los elementos de cada columna. 25. Se dice que un vector v = (v 1, v 2,..., v n ) es una mochila perfecta si cada elemento del vector es mayor que la suma de todos los anteriores. Lea un vector de orden n e indique si es o no una mochila perfecta. 20