Dra. Jessica Andrea Carballido [email protected] Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Iteración La estructura de control ITERATIVA permite modelar problemas en los cuales una secuencia de instrucciones debe ejecutarse varias veces. La cantidad de iteraciones puede quedar determinada por una variable de control que toma valores dentro de un rango escalar o por una expresión lógica. En el primer caso hablamos de iteración con contador y en el segundo hablamos de iteración con condición. Iteración con contador: for Repetir N veces Número natural ACCIONES Repetir 3 veces Accion1 Accion2 Accion1 Accion2 Accion1 Accion2 Accion1 Accion2 Ejercicio de Pilates Recostarse en la colchoneta Repetir 30 veces Elevar las piernas Bajarlas lentamente Elongar 3 Iteración Repetir N veces ACCIONES Número natural PARA i desde: 1 hasta: N HACER ACCIONES 4 Iteración Problema: Mostrar un ‘*’ tantas veces como lo indique el usuario. Algoritmo ASTERISCOS DE: N DS: Asteriscos Daux: Para mostrados en pantalla i i desde 1 hasta N hacer Mostrar(‘*’) Iteración con contador: for Problema: A partir de una base y un exponente calcular la potencia (baseexponente) Ej.: base=2, exponente=4 debe calcular 24 ¿Cuáles son los datos de entrada? ¿Cuáles son los datos de salida? ¿Cuáles pueden ser los casos de prueba? Exponente veces Si base=2, exponente=4 debo calcular 2*2*2*2 Acumulación de productos sucesivos: 1*2 .. *2 .. *2 .. *2 Iteración con contador: for Algoritmo Potencia DE: base, exponente DS: pot Daux: i Comienzo pot <- 1 para i desde 1 hasta exponente pot <- pot * base Fin pot := 1; for i:= 1 to exponente do pot := pot * base; La variable de control toma valores en el rango que determinan la expresión inicial y la expresión final. Iteración con contador: for Expresión inicial pot := 1; Expresión final for i:= 1 to exponente do pot := pot * base; • La variable i (podemos usar cualquier variable entera) se inicializa al ingresar al for con el valor obtenido de evaluar la expresión inicial. Con este valor se ejecuta por primera vez el bucle. • Automáticamente, i se va incrementando en 1 unidad luego de cada ejecución del bucle. La última vez que se ejecuta el for es con i = expresión final. Iteración con contador: for Program potencia; Var pot, i, exponente: integer; begin writeln(‘Ingrese la base y el exponente’); readln(base, exponente); pot := 1; for i:= 1 to exponente do pot := pot * base; writeln(‘El valor de la potencia es: ‘, pot); end. Iteración con contador: for Problema: A partir de un valor n calcular la serie 12 + 22 + 32 + ... + n2 ¿Cuáles son los datos de entrada? ¿Cuáles son los datos de salida? ¿Cuáles pueden ser los casos de prueba? n veces Si n=5 debo calcular 12 + 22 + 32 + 42 + 52 Acumulación de sumas sucesivas: 0+12 .. + 22 .. +32 .. +n2 El valor de la base en cada término varía desde 1 hasta n. Iteración con contador: for Algoritmo SumaDeSerie DE: n DS: serie Comienzo serie <- 0 base <- 1 Repetir n veces serie <- serie + base*base base <- base+1 Fin serie := 0; for base := 1 to n do serie := serie + sqr(base); La variable de control toma valores en el rango que determinan la expresión inicial y la expresión final. Iteración con contador: for program serie; {Computa 12 + 22 + 32 + ... + n2 } var base, n, serie: integer; serie: real; begin write (‘Ingrese el valor de n ‘); readln (n); serie := 0; for base:= 1 to n do serie := serie + sqr(base); writeln (‘El valor es ‘, serie); end. ¿Qué pasa si el usuario ingresa un valor menor o igual a 0? Iteración con contador: for Escribir un programa que muestre el código ASCII de todas las letras mayúsculas. ¿Cuáles son los datos de entrada? ¿Cuáles son los datos de salida? ¿Cuáles pueden ser los casos de prueba? A= 65 B= 66 C= 67 .. X= 88 Y= 89 Z= 90 32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 ii 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 128 Ç 129 ü Iteración con contador: for Escribir un programa que muestre el código ASCII de todas las letras mayúsculas. writeln ('A',‘=', ord('A')); writeln ('B', '=', ord('B')); writeln ('C',‘=', ord('C')); … La letra “varía” tomando valores 'A','B',… hasta 'Z‘. Podemos usar una única instrucción reemplazando la constante literal con una variable. writeln (letra,‘= ‘, ord(letra)); Iteración con contador: for Escribir un programa que muestre el código ASCII de las letras mayúsculas. program ordinalesLetras; var letra: char; begin for letra := 'A' to 'Z' do writeln (letra,‘ = ',ord(letra)); end. La variable de control toma valores en el rango que determinan los caracteres ‘A’ y ‘Z’. Iteración con contador: for Escribir un programa que muestre los factores positivos de un número entero n. ¿ 1 es divisor de n ? ¿ 2 es divisor de n ? ¿ 3 es divisor de n ? En cada iteración se evalúa una condición. ¿Cómo lo generalizamos? ¿ i es divisor de n? ¿Cuándo terminamos? ¿Cómo lo expresamos en Pascal? Iteración con contador: for program divisores; {Muestra los divisores de un número n} var i, n: integer; begin write (‘Ingrese el valor para n: ’); readln(n); writeln (‘Los factores positivos de n son ‘); for i := 1 to n do if (n mod i = 0) then write (i); end. El bloque iterativo se ejecuta n veces; el valor de la variable de control es diferente cada vez. Iteración con contador: for Escribir un programa que muestre los factores positivos de un número entero n de mayor a menor. program divisores; {Muestra los divisores de un número n} var i,n:integer; begin write (‘Ingrese el valor de n’); readln(n); writeln (‘Los divisores son ‘); for i := n downto 1 do if (n mod i = 0) then write (i); end. Iteración con contador: for Diagrama de sintaxis “Instrucción” puede ser una o varias acciones Iteración con contador: for Realice trazas para descubrir la salida de los siguientes programas. for i:= 1 to 5 do begin for j:= 1 to 3 do write (i); writeln; end; for i:= 1 to 5 do begin for j:= 1 to 3 do write (‘(‘, i, ‘ ‘,j, ’)’); writeln; end; for i:= 1 to 5 do begin write (i); for j:= 1 to i do write (j); writeln; end; for i:= 1 to 5 do begin write (i); for j:= i downto 1 do write (j); writeln; end; La instrucción de un for puede ser un for anidado. Iteración con contador: for • Nombres claros y uso consistente de mayúsculas y minúsculas. • Indentación y espaciado. • Usar comentarios con buen criterio: los comentarios excesivos pueden resultar contraproducentes; el comentario debe describir características del problema o de la solución, no del lenguaje de programación. • No modificar valores de las variables que controlan los bucles for. • Si vamos a utilizar la variable de control después de que termina la iteración debemos inicializarla. • No podemos asumir ningún valor para la variable de control una vez que estamos fuera del bucle for. Iteración Una fábrica asigna a cada artículo un código formado por tres caracteres. El primero es una letra (A, B o C), el segundo es un dígito (3, 4, 5 o 6) y el tercero es una letra (x o y). Escriba un segmento de programa que muestre una tabla con todos los códigos posibles, agrupando los dos códigos que coinciden en los dos primeros caracteres en una misma línea. A3x A3y A4x A4y A5x A5y A6x A6y B3x B3y B4x B4y … writeln (letra, digito, ’x’,’ ‘, letra, digito, ’y’); Iteración A3x A3y A4x A4y A5x A5y A6x A6y for digito := 3 to 6 do writeln (letra, digito, ’x’, ’ ‘, letra, digito, ’y’); Iteración for letra := ‘A’ to ‘C’ do for digito := 3 to 6 do writeln (letra, digito, ’x’, ’ A3x A3y A4x A4y A5x A5y A6x A6y B3x B3y B4x B4y B5x B5y B6x B6y C3x C3y … ‘, letra, digito, ’y’); Iteración Una fábrica asigna a cada artículo un código formado por tres caracteres. El primero es una letra (A, B o C), el segundo es un dígito (3, 4, 5 o 6) y el tercero es una letra (v, w, x, y, z). Escriba un segmento de programa que muestre una tabla con todos los códigos posibles, agrupando los cinco códigos que coinciden en los dos primeros caracteres en una misma línea. Iteración A3v A4v A5v A6v B3v B4v for letra1 := ‘A’ to ‘C’ do for digito := 3 to 6 do begin for letra2 := ‘v’ to ‘z’ do write(letra1, digito, letra2, ’ ‘); writeln ; end A3w A4w A5w A6w B3w B4w A3x A4x A5x A6x B3x B4x … A3y A4y A5y A6y B3y B4y A3z A4z A5z A6z B3z B4z CHAU! Hasta la próxima clase