Resolución de Problemas y Algoritmos Clase 6: Repetición (continuación) Dr. Sergio A. Gómez http://cs.uns.edu.ar/~sag Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca, Argentina Temario • Repaso de estructuras de control repetitivas: – Repetición contada: For-to-do y for-downto-do – Repetición condicional: While y Repeat-until • Ejemplos con while, for y repeat • Ejemplos solución a problemas con bucles anidados Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 2 Repetición contada: Sentencia FOR • Permite ejecutar una sentencia (o un bloque de código especificado como una sentencia estructurada) un número entero de veces. •El tipo de i, A y B debe ser el for i := A to B do mismo y deben ser de un tipo sentencia ordinal . •Sentencia se ejecuta max(Ord(B)-Ord(A)+1,0) veces. •Sentencia •i se llama “índice” del for o puede “variable de control” referenciar el •i toma los valores A, Succ(A), valor i pero no Succ(Succ(A)),…, B lo puede Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez modificar. 3 Repetición contada: Sentencia FOR • Permite ejecutar una sentencia (o un bloque de código especificado como una sentencia estructurada) un número entero de veces. •El tipo de i, A y B debe ser el for i := A downto B do mismo y deben ser de un tipo sentencia ordinal . •Sentencia se ejecuta •Sentencia max(Ord(A)-Ord(B)+1,0) veces. puede •i se llama “índice” del for o referenciar el “variable de control” valor i pero no •i toma los valores A, Pred(A), lo puede Pred(Pred(A)),…, B Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez modificar. 4 Repetición condicional: While While condición do Sentencia • Permite ejecutar una sentencia del cuerpo del while (posiblemente estructurada) mientras se cumple la condición lógica. • El bucle puede realizar 0, 1 o más iteraciones. • En la sentencia del cuerpo debe haber una primitiva que eventualmente (alguna vez en el futuro) haga falsa a la condición; si esto no ocurre, el programa ingresará en un ciclo infinito (también se dice “loop infinito”). • Nota: Es imposible detectar automáticamente todos los programas que producen ciclos infinitos (“Halting problem” en Teoría de la Computabilidad). Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 5 Repetición condicional: Repeat-until Repeat sentencia until condición • Permite ejecutar una sentencia del cuerpo del repeat (posiblemente estructurada) hasta que se cumple la condición lógica. • El bucle puede realizar 1 o más iteraciones. • En la sentencia del cuerpo debe haber una primitiva que eventualmente (alguna vez en el futuro) haga verdadera a la condición; si esto no ocurre, el programa ingresará en un ciclo infinito (también se dice “loop infinito”). • Nota: Es imposible detectar automáticamente todos los programas que producen ciclos infinitos (“Halting problem” en Teoría de la Computabilidad). Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 6 Bucles: Ejemplo • Problema: Escriba un programa que dado un número entero positivo y mayor a 0 determine cuántos dígitos pares e impares contiene. • Algoritmo: Leer un número n cantidad_pares 0 cantidad_impares 0 para cada dígito d de n hacer si d es par entonces incrementar cantidad_pares sino incrementar cantidad_impares mostrar cantidad_pares y cantidad_impares Ojo: No podemos usar un “for” porque no sabemos la cantidad de dígitos de n; ¿o quizá sí?. Exploremos implementaciones posibles. 7 Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez Bucles: Ejemplo: Solución con while • Problema: Escriba un programa que dado un número entero positivo y mayor a cero determine cuántos dígitos pares e impares contiene. Leer un número n cantidad_pares 0 cantidad_impares 0 mientras n>0 hacer d n mod 10 { d es el último dígito de n. } si d es par entonces incrementar cantidad_pares sino incrementar cantidad_impares n n div 10 { Le borro el último dígito a n. } finmientras mostrar cantidad_pares y cantidad_impares Ejercicio: Implementar el algoritmo en Pascal. Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 8 Bucles: Ejemplo: Solución con for Leer un número n { Averiguo cuántos dígitos tiene n. } Ejercicio: cantidad_digitos 0; copia_n n Implementar el mientras copia_n > 0 hacer algoritmo incrementar cantidad_digitos en Pascal y hacer copia_n copia_n div 10 la traza Finmientras { Cuento dígitos pares e impares. } cantidad_pares 0; cantidad_impares 0 Para i desde 1 hasta cantidad_digitos hacer d n mod 10 { d es el último dígito de n. } si d es par entonces incrementar cantidad_pares sino incrementar cantidad_impares n n div 10 { Le borro el último dígito a n. } finpara mostrar cantidad_paresResolución y cantidad_impares de Problemas y Algoritmos - Dr. Sergio A. Gómez 9 Bucles anidados: Ejemplo • Problema: Realizar un programa para calcular el valor 2 4 de la expresión: (i + 3 j ) ∑∑ • Algoritmo: i =1 j =1 Suma 0 Para i desde 1 hasta n hacer para j desde 1 hasta m hacer suma suma + i + 3j Program SumaTodo; Var suma : real; Begin suma := 0.0; for i := 1 to 2 do for j := 1 to 4 do suma := suma + i + 3*j; Write(‘Suma vale: ‘, suma : 10 : 3 ) End. Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 10 Bucles anidados: Ejemplo • Problema: Realizar un programa para calcular el valor n m 2 de la expresión: ( 3 i + 2seno(5 j )) ∑∑ i =1 j =1 • Algoritmo: Suma 0 Para i desde 1 hasta n hacer para j desde 1 hasta m hacer suma suma + 3i2 + 2seno(5j) Program SumaTodo2; Var suma : real; Begin Write(‘Ingrese n y m: ‘ ); Read(n,m); suma := 0.0; for i := 1 to n do for j := 1 to m do suma := suma + 3*sqr(i) + 2*sin(5*j); Write(‘Suma vale: ‘, suma : 10 : 3 ) Resolución de Problemas y Algoritmos - Dr. End. Sergio A. Gómez 11 Bucles anidados • Problema propuesto: Realizar un programa para calcular el valor de la expresión: n m r ∑∑∑ (3i 2 + 2 tan(5 j − ln(k ))) i =1 j =5 k =8 Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 12 Bucles anidados: Problema • Problema propuesto: Realizar un programa para imprimir las tablas de multiplicar de acuerdo a como se muestra en la siguiente captura de pantalla: Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 13 program tablas_multiplicar; var i, j : integer; resultado : integer; __c : char; begin { Imprimo 1era fila con las columnas de multiplicandos derechos. } Write( ' | ' ); for j := 1 to 10 do Write( j : 5 ); WriteLn; { Imprimo linea separadora. } for j := 1 to 11 do Write( '-----' ); WriteLn; 14 { Imprimo tablas propiamente dichas. } for i := 1 to 10 do begin Write( i:2, ' | ' ); { Imprimo multiplicando izquierdo. } for j := 1 to 10 do begin resultado := i * j; Write( resultado : 5 ); end; WriteLn; end; WriteLn; { Prevengo el cierre de la pantalla. } Write( 'Ingrese enter para terminar...' ); ReadLn( __c ); End. 15 Bucles simples: Ejemplo • Problema: Dada una secuencia S de caracteres ingresada por teclado y terminada en un punto, determinar cuántas veces aparece la C seguida de la A. • Ejemplo: si S = CABEZA DE CALABAZA., la salida del programa es 2. • No se conoce el largo de la secuencia => usar “while” o “repeat” (y no “for”) • No es necesario procesar el punto (pues no es ni C ni A) => usar “while” • Notar que ahora en la solución del problema no sólo hay que procesar al elemento actual sino mantener cuál fue el elemento anterior. Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 16 Bucles simples: Ejemplo • Problema: Dada una secuencia S de caracteres ingresada por teclado y terminada en un punto, determinar cuántas veces aparece la C seguida de la A. • Algoritmo: Cantidad_de_veces 0 Pedir una secuencia de caracteres terminada en punto Leer un carácter c; anterior ‘_’ Mientras c ≠‘.’ hacer si anterior = ‘C’ y c = ‘A’ entonces incrementar cantidad_de_veces anterior c Ejercicio: Escribir la Leer un carácter c solución en Pascal. Finmientras Mostrar la cantidad_de_veces Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 17 Bucles simples: Problema • Problema propuesto: Dada una secuencia de caracteres terminada en punto, determinar cuántas veces aparece la subsecuencia MOMO dentro de la secuencia. • Realice un algoritmo e impleméntelo en Pascal. Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 18 Sumario de temas • Repaso de estructuras de control repetitivas: – Repetición contada: For-to-do y for-downto-do – Repetición condicional: While y Repeat-until • Ejemplos con while, for y repeat • Ejemplos solución a problemas con bucles anidados Resolución de Problemas y Algoritmos - Dr. Sergio A. Gómez 19