Resolución de Problemas y Algoritmos Clase 6: Repetición (continuación) Dr. 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, fory repeat Ejemplos solución a problemas con bucles anidados 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. fori := A tob do sentencia Sentencia puede referenciar el valor i pero no lo puede modificar. El tipo de i, A y B debe ser el mismo y deben ser de un tipo ordinal. Sentencia se ejecuta max(ord(b)-ord(a)+1,0) veces. i se llama índice del foro variable de control i toma los valores A, Succ(A), Succ(Succ(A)),, B 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. fori := A downtob do sentencia Sentencia puede referenciar el valor i pero no lo puede modificar. El tipo de i, A y B debe ser el mismo y deben ser de un tipo ordinal. Sentencia se ejecuta max(ord(a)-ord(b)+1,0) veces. i se llama índice del foro variable de control i toma los valores A, Pred(A), Pred(Pred(A)),, B 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). 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). 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 paracada 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
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 mod10 { d es el último dígito de n. } si d es par entonces incrementar cantidad_pares sino incrementar cantidad_impares n n div10 { Le borro el último dígito a n. } finmientras mostrar cantidad_pares y cantidad_impares Ejercicio: Implementar el algoritmo en Pascal. 8
Bucles: Ejemplo: Solución con for Leer un número n { Averiguo cuántos dígitos tiene n. } cantidad_digitos 0; copia_n n mientras copia_n > 0 hacer incrementar cantidad_digitos copia_n copia_ndiv10 Finmientras { Cuento dígitos pares e impares. } cantidad_pares 0; cantidad_impares 0 Para i desde 1 hasta cantidad_digitos hacer d n mod10 { d es el último dígito de n. } si d es par entonces incrementar cantidad_pares sino incrementar cantidad_impares n n div10 { Le borro el último dígito a n. } finpara mostrar cantidad_pares y cantidad_impares Ejercicio: Implementar el algoritmo en Pascal y hacer la traza 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 Parai desde1 hastan hacer paraj desde1 hastam hacer suma suma + i + 3j Program SumaTodo; Var suma : real; Begin suma := 0.0; fori := 1 to2 do forj := 1 to4 do suma := suma + i + 3*j; Write( Suma vale:, suma : 10 : 3 ) End. 10
Bucles anidados: Ejemplo Problema:Realizar un programa para calcular el valor n m de la expresión: 2 (3i + 2seno(5 j)) Algoritmo: i= 1 j= 1 Suma 0 Parai desde1 hastan hacer paraj desde1 hastam hacer suma suma + 3i 2 + 2seno(5j) Program SumaTodo2; Var suma : real; Begin Write( Ingrese n y m: ); Read(n,m); suma := 0.0; fori := 1 ton do forj := 1 tom do suma := suma + 3*sqr(i) + 2*sin(5*j); Write( Suma vale:, suma : 10 : 3 ) End. 11
Bucles anidados Problemapropuesto: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 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: 13
program tablas_multiplicar; vari, j : integer; resultado : integer; c : char; begin { Imprimo 1era fila con las columnas de multiplicandos derechos. } Write( ' ' ); forj := 1 to10 do Write( j : 5 ); WriteLn; { Imprimo linea separadora. } forj := 1 to11 do Write( '-----' ); WriteLn; 14
{ Imprimo tablas propiamente dichas. } fori := 1 to10 do begin Write( i:2, ' ' ); { Imprimo multiplicando izquierdo. } forj := 1 to10 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. 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 _ Mientrasc. hacer sianterior = C yc = A entonces incrementar cantidad_de_veces anterior c Leer un carácter c Finmientras Mostrar la cantidad_de_veces Ejercicio: Escribir la solución en Pascal. 17
Bucles simples: Problema Problema propuesto:dada una secuencia de caracteres terminada en punto, determinar cuántas veces aparece la subsecuenciamomo dentro de la secuencia. Realice un algoritmo e impleméntelo en Pascal. 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, fory repeat Ejemplos solución a problemas con bucles anidados 19