07/09/2015 Resolución de Problemas y Algoritmos Dr. Sergio A. Gómez Temario Resolución de Problemas y Algoritmos Segundo cuatrimestre 2015 Clase 5: Repetición • Estructuras de control/sentencias repetitivas: – Repetición contada: for‐to‐do y for‐downto‐do – Repetición condicional: while y repeat 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 Patrones de procesamiento de secuencias Máximos y mínimos Contadores y acumuladores Totalizaciones y promedios Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Motivaciones Preliminares: Tipos ordinales • Tomadas solas o en secuencias, las acciones primitivas (entrada, salida y asignación) realizan sólo tareas simples. • Para resolver problemas más ambiciosos, las acciones primitivas deben ser combinadas en maneras más imaginativas. • Hay tres construcciones fundamentales para componer acciones pequeñas en acciones más grandes y complejas: • Un tipo es ordinal si: – es contable y enumerable – tiene primer y último valor – cada valor x del tipo tiene siguiente (excepto el último), calculado como Succ(x) – cada valor x tiene anterior (excepto el primero), calculado como Pred(x). • Los tipos ordinales de Pascal son boolean, char, integer, y enumerado (no lo dimos aún). – Secuencia – Decisión (también conocida como “selección”) – Repetición Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez • Ejemplo: Pred(5) es 4 y Succ(5) = 6 Pred(‘A’) = ‘@’ y Succ(‘A’) = ‘B’ succ(false) = true y pred(true) = false Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 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 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. 2 4 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 mismo y deben ser de un tipo ordinal . •Sentencia se ejecuta max(Ord(A)‐Ord(B)+1,0) veces. •i se llama “índice” del for o “variable de control” •i toma los valores A, Pred(A), Pred(Pred(A)),…, B Resolución de Problemas y Algoritmos ‐ Dr. for i := A downto B do sentencia 5 •Sentencia puede referenciar el valor i pero no lo puede modificar. Sergio A. Gómez 6 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 1 07/09/2015 Resolución de Problemas y Algoritmos Dr. Sergio A. Gómez Repetición contada • Al comenzar a V se le asigna el valor inicial y luego, V se incrementada automáticamente de a uno hasta llegar al valor final. FOR V:= 1 TO 100 DO <sentencia> Aquí <sentencia> se repite 100 veces FOR V:= 100 TO 199 DO <sentencia> Aquí <sentencia> se repite 100 veces FOR V:= ‐10 TO ‐1 DO <sentencia> Aquí <sentencia> se repite 10 veces FOR V:= 1 TO ‐2 DO <sentencia> 7 Sentencia FOR: Ejemplo – se conoce (o se puede computar) de antemano la cantidad de iteraciones/repeticiones a realizar o, – Dada una secuencia de datos a procesar, se conoce (o se puede computar) la cantidad de elementos de dicha secuencia de datos. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 8 Sentencia FOR: Ejemplo • Problema: Dado un número n leído por teclado calcular la suma 1+2+3+…+(n‐1)+n. • Diseño del algoritmo: Algoritmo: Pedir al usuario que ingrese un entero n Leer un entero n de teclado la suma de los números vale inicialmente 0 para cada valor i desde 1 hasta n hacer agregar a la suma parcial el valor de i fin para mostrar el valor de la suma de los números • Problema: Dado un número n leído por teclado calcular la suma 1+2+3+…+(n‐1)+n. Program Sumatoria; var n : integer; { Tope de la sumatoria. } suma : integer; { Valor de la sumatoria parcial. } i : integer; { Indice del for. } Begin Write(‘Ingrese el valor de n: ‘ ); ReadLn(n); suma := 0; for i := 1 to n do ¡HACER LA TRAZA! suma := suma + i; ¿Hay una solución más simple? WriteLn( ‘La suma vale: ‘, suma ) End. El uso dado a la variable “suma” se llama acumulador. 9 Sentencia FOR: Ejemplo Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 10 Sentencia FOR: Ejemplo Problema: Mostrar en orden descendente todos los múltiplos de 3 y de 7 que hay en el intervalo entero [2,4500]. Algoritmo: Para cada entero x entre 4500 y 2 hacer si x es múltiplo de 3 y x es múltiplo de 7 entonces mostrar x finsi finpara Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez • Heurística para usar un FOR: Se utiliza cuando: • Nota: Una “heurística” es una regla que expresa un consejo o receta que generalmente produce buenos resultados pero no garantiza el éxito. Aquí <sentencia> se repite 0 veces Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Repetición contada: Sentencia FOR 11 Problema: Mostrar en orden descendente todos los múltiplos de 3 y de 7 que hay en el intervalo entero [2,4500]. Program multiplos; Var x : integer; Begin WriteLn( ‘Los múltiplos de 3 y 7 son: ‘ ); for x := 4500 downto 2 do if (x mod 3 = 0) and (x mod 7 = 0) then Write( x, ‘ ‘ ); WriteLn; End. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 12 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2 07/09/2015 Resolución de Problemas y Algoritmos Dr. Sergio A. Gómez Sentencia FOR: Ejemplo Sentencia FOR: Ejemplo Problema: Mostrar todas las letras mayúsculas del alfabeto. Problema: Mostrar todas las letras mayúsculas del alfabeto. Algoritmo: Para cada letra c entre la A y la Z hacer mostrar la letra c FinPara Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Program MostrarAlfabeto; Var c : char; Begin WriteLn( ‘Las letras del alfabeto son: ‘ ); for c := ‘A’ to ‘Z’ do Write( c ); WriteLn End. Sentencia FOR: Ejemplo program maximodesecuencia; var a, i, n, max : integer; begin Write( 'Ingrese un numero positivo: ' ); ReadLn( n ); max := ‐1; for i := 1 to n do begin Write( 'Ingrese el numero a(', i, '): ' ); ReadLn( a ); if a > max then max := a; end; WriteLn( 'El maximo de la secuencia es ', max ) end. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 15 16 Hacia la repetición condicional Sentencia FOR: Ejemplo revisado program maximosecuencia2; var a, i, n, max : integer; begin Write( 'Ingrese un numero positivo: ' ); ReadLn( n ); WriteLn( 'Ingrese una secuencia de ', n, ' numeros positivos:' ); max := ‐1; for i := 1 to n do ¿Cuál es la diferencia? begin Usa el buffer de teclado. Read( a ); if a > max then max := a; end; WriteLn( 'El maximo de la secuencia es ', max ); Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 14 Sentencia FOR: Ejemplo • Problema: Dada una secuencia S = a1, …, an de números enteros positivos donde n se le pide al usuario, se desea hallar el máximo de S. • Algoritmo: Leer un número entero positivo n Suponer que el máximo es ‐1 para cada indice i entre 1 y n hacer leer el número ai si ai > máximo entonces máximo es ai finsi finpara Mostrar el máximo Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 13 • Repeticiones: – Repetición contada (incondicional): especifica una sentencia que se repite un número fijo de veces FOR i := 1 to n DO sentencia(i) – Repetición condicional: especifica una sentencia que debe ejecutarse mientras se cumpla una condición WHILE condición sentencia 17 REPEAT sentencia UNTIL condición Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 18 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 3 07/09/2015 Resolución de Problemas y Algoritmos Dr. Sergio A. Gómez Repetición condicional: While Repetición condicional en Pascal: While • Heurísticas para usar un 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”). Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 19 Sentencia While: Ejemplo • Problema: Determinar si un número entero n ingresado por teclado es primo. • Algoritmo: Leer un número n d es el primer posible divisor de n (i.e. 2) Supongo que n es primo Mientras (d<n) y sigo suponiendo que n es primo hacer si d divide a n entonces no es primo sino incremento d en 1 finsi Finmientras Si sigo suponiendo que n es primo entonces Informar que n es primo Sino Informar que n no es primo finsi Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 21 Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 20 Program DeterminarPrimo; ¿Cómo se puede optimizar? Var n : integer; d : integer; es_primo : boolean; Begin Write( ‘Ingrese n: ‘ ); ReadLn( n ); d := 2; es_primo := true; while (d<n) and es_primo do if n mod d = 0 then es_primo := false else d := d + 1; if es_primo then WriteLn( n, ‘ es primo.’ ) else WriteLn( n, ‘no es primo.’ ); Resolución de Problemas y Algoritmos ‐ Dr. End. 22 Sergio A. Gómez Patrón de procesamiento: Ejemplo Patrón de procesamiento • Problema: Dada una secuencia caracteres terminada con punto, se desea contar cuántas veces aparecen las letras A, B y C. • Algoritmo: Pedir al usuario el ingreso de una secuencia Contar que la letra A aparece 0 veces Contar que la letra B aparece 0 veces Contar que la letra C aparece 0 veces Obtener el primer carácter c de la secuencia mientras c ≠ ‘.’ hacer si c = ‘A’ entonces incrementar apariciones de A sino si c = ‘B’ entonces incrementar apariciones de B sino si c = ‘C’ entonces incrementar apariciones de C obtener el siguiente carácter c de la secuencia finmientras Mostrar la cantidad de apariciones de A, B y C Patrón para procesar secuencias con while donde no interesa procesar al último elemento: Preparar adquisición de datos de la secuencia Adquirir primer elemento x de la secuencia Mientras elemento actual x no es el centinela hacer procesar elemento x obtener siguiente elemento x de la secuencia finmientras Procesar elemento centinela x Terminar el procesamiento de la secuencia Nota: Este patrón de solución es solamente aplicable a esta clase de problemas y no necesariamente a todos los problemas que requieren usar un while para su solución. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez – No se conoce la cantidad de iteraciones a realizar – Puede ocurrir que no sea necesario realizar ni siquiera una iteración – Se va a procesar una secuencia de datos cuya longitud no se conoce – Se conoce la longitud de la secuencia de datos pero por algún motivo nos interesa romper el ciclo antes de terminar de procesar la secuencia – Se va a procesar una secuencia de datos donde hay un “centinela” de terminación de la secuencia que no se quiere procesar dentro del while. 23 Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 24 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 4 07/09/2015 Resolución de Problemas y Algoritmos program Secuencia1; var c : char; cont_A, cont_B, cont_C : integer; { Contadores!!! } begin WriteLn( 'Ingrese una cadena terminada en punto'); cont_A := 0; cont_B := 0; cont_C := 0; read(c); while c <> '.' do begin if c = 'A' then cont_A := cont_A + 1 else if c = 'B' then cont_B := cont_B + 1 else if c = 'C' then cont_C := cont_C + 1; read(c) end; WriteLn( 'Cantidad de A''s: ', cont_A ); WriteLn( 'Cantidad de B''s: ', cont_B ); WriteLn( 'Cantidad de C''s: ', cont_C ) end. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Dr. Sergio A. Gómez Patrón de procesamiento: Ejemplo • Problema: Dada una secuencia de números terminada en 0, se desea hallar el promedio de los números sin incluir al 0 final. • Ejercicio: Realizar un diseño algorítmico y escribir el programa Pascal correspondiente. 25 Ejercicio 27 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”). Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 28 Repetición condicional: Repeat‐until Patrón de procesamiento Patrón para procesar secuencias de largo desconocido con repeat‐ until donde sí interesa procesar al último elemento: Preparar adquisición de datos de la secuencia Repetir Adquirir elemento x de la secuencia procesar elemento x Hasta que el elemento x es el centinela Terminar el procesamiento de la secuencia Nota: Este patrón de solución es solamente aplicable a esta clase de problemas y no necesariamente a todos los problemas que requieren usar un repeat‐until para su solución. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 26 Repetición condicional: Repeat‐until • Problema: Escriba un programa Pascal para determinar si un número N posee un dígito D. Ej: si D = 3 y N=1234, entonces D aparece. Ej: si D = 6 y N=661, entonces D aparece. Ej: si D = 3 y N=661, entonces D NO aparece. Solución: voy mirando dígito a dígito y si alguno es igual a D es que aparece; si recorro todo el número y ninguno es igual a D entonces no aparece. (¿cómo puedo “mirar” un dígito particular?) Para obtener el último dígito de N : N mod 10 Para eliminar el último dígito de N : N div 10 Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 29 • Heurísticas para usar un repeat: – No se conoce la cantidad de iteraciones a realizar – Siempre se va a realizar al menos una iteración – Se va a procesar una secuencia de datos cuya longitud no se conoce – Se conoce la longitud de la secuencia de datos pero por algún motivo nos interesa romper el ciclo antes de terminar de procesar la secuencia – Se va a procesar una secuencia de datos donde hay un “centinela” de terminación de la secuencia que sí se quiere procesar dentro del repeat. Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 30 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 5 07/09/2015 Resolución de Problemas y Algoritmos Dr. Sergio A. Gómez Program Secuencia2; Const centinela = 8; Var x : real; suma : real; cantidad : integer; Begin cantidad := 0; suma := 0.0; repeat Write( ‘Ingrese un número: ‘ ); ReadLn( x ); cantidad := cantidad + 1; suma := suma + x; until x = centinela; WriteLn( ‘El promedio es: ‘, suma / cantidad : 10 : 2 ) End. Sentencia Repeat: Ejemplo • Problema: Procesar una secuencia de números terminada en 8 y obtener el promedio. • Algoritmo: Cantidad es 0 Suma es 0 Repetir Leer elemento x incrementar cantidad acumular x en suma Hasta que x es el centinela Calcular el promedio como suma/cantidad Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 31 Diferencias entre REPEAT y WHILE REPEAT‐UNTIL • si condición es falsa sigue repitiendo. • si condición es verdadera deja de repetir. • repite 1 o más veces: siempre ejecuta al menos una vez la secuencia interna al repetir Equivalencias WHILE • si condición es verdadera sigue repitiendo • si condición es falsa deja de repetir • repite 0 o más veces: puede no ejecutar nunca la secuencia interna al repetir Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 32 33 While B do S; if B then repeat For i := A to B do S; Terminar := B<A; i := A; While not Terminar do Begin S; if i=B then Terminar := true else i := Succ(i); End; S until not B; Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 34 Sumario de temas • Estructuras de control repetitivas: – Repetición contada: for‐to‐do y for‐downto‐do – Repetición condicional: while y repeat • • • • Patrones de procesamiento de secuencias Máximos y mínimos Contadores y acumuladores Totalizaciones y promedios Resolución de Problemas y Algoritmos ‐ Dr. Sergio A. Gómez 35 El uso total o parcial de este material está permitido siempre que se haga mención explícita de su fuente: “Resolución de Problemas y Algoritmos. Notas de Clase”. Sergio A. Gómez. Universidad Nacional del Sur. (c)2011-2015. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 6