Sentencia FOR - Departamento de Ciencias e Ingeniería de la

Anuncio
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
Descargar