uns-rpa-2015-clase-0(...) (14/sep)

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