Diferencia entre revisiones de «PrInf13: Interrumpir bucles»

De MateWiki
Saltar a: navegación, buscar
(Ejercicio post-práctica)
(Contenido de la práctica)
Línea 23: Línea 23:
  
 
== Contenido de la práctica ==
 
== Contenido de la práctica ==
 +
 +
=== Primeros pasos con ''break'' ===
 +
 
Vamos a ver primero un pequeño ejemplo de un programa que usa un bucle con interrupción, para ilustrar su uso. Primero, creamos un vector aleatorio con 20 elementos, entre 0 y 10 y sin parte decimal. Luego usamos un bucle para recorrer el vector y buscar la primera posición que contiene un número impar. Mientras el bucle no encuentre un número impar, sigue funcionando, escribiendo los números que va encontrando en la pantalla: {{ matlab | codigo=
 
Vamos a ver primero un pequeño ejemplo de un programa que usa un bucle con interrupción, para ilustrar su uso. Primero, creamos un vector aleatorio con 20 elementos, entre 0 y 10 y sin parte decimal. Luego usamos un bucle para recorrer el vector y buscar la primera posición que contiene un número impar. Mientras el bucle no encuentre un número impar, sigue funcionando, escribiendo los números que va encontrando en la pantalla: {{ matlab | codigo=
 
v = fix(rand(1,20)*10); % Vector con 20 elementos entre 0 y 10
 
v = fix(rand(1,20)*10); % Vector con 20 elementos entre 0 y 10
Línea 37: Línea 40:
 
Si ejecutamos este programa muchas veces, cada vez obtendremos un resultado diferente. Es muy importante entender que esto solo es un ejemplo de cómo funciona ''break''. Este programa tendría un mejor diseño si se realizara con un bucle ''while'' (mientras no encuentres un impar, sigue recorriendo el vector).
 
Si ejecutamos este programa muchas veces, cada vez obtendremos un resultado diferente. Es muy importante entender que esto solo es un ejemplo de cómo funciona ''break''. Este programa tendría un mejor diseño si se realizara con un bucle ''while'' (mientras no encuentres un impar, sigue recorriendo el vector).
 
{{ Tarea | Transforma el programa anterior para que use ''while'', y no use ni ''for'' ni ''break'' }}
 
{{ Tarea | Transforma el programa anterior para que use ''while'', y no use ni ''for'' ni ''break'' }}
 +
 +
=== Primeros pasos con ''continue''
 +
 +
 +
=== Ejemplo real de uso de ''break'': encontrar si un número es primo ===
 +
 
Una vez que hemos entendido cómo funciona ''break'', vamos a aplicarlo a un caso real. Se trata de averiguar si un número es primo. Recordemos que un número es primo si solo se puede dividir por 1 y por sí mismo. Los divisores de un número tienen que ser necesariamente menores que ese número. Por tanto, nuestro programa probará todos los números más pequeños que nuestro número, y si encuentra alguno que lo divida, entonces resulta que el número no es primo. Veamos el código: {{ matlab | codigo =
 
Una vez que hemos entendido cómo funciona ''break'', vamos a aplicarlo a un caso real. Se trata de averiguar si un número es primo. Recordemos que un número es primo si solo se puede dividir por 1 y por sí mismo. Los divisores de un número tienen que ser necesariamente menores que ese número. Por tanto, nuestro programa probará todos los números más pequeños que nuestro número, y si encuentra alguno que lo divida, entonces resulta que el número no es primo. Veamos el código: {{ matlab | codigo =
 
n = input('Introduce el número para probar si es primo: ');
 
n = input('Introduce el número para probar si es primo: ');

Revisión del 12:57 2 ago 2013

Práctica de Informática
Cómo interrumpir bucles
Práctica anterior Siguiente práctica
Este artículo es un guión de prácticas de Informática


Warning.png Este artículo está en versión beta. El autor de este artículo no lo ha terminado todavía, por favor no lo edites hasta que elimine este mensaje.

Algunos métodos numéricos intentan buscar la solución a un problema entre los elementos de una matriz y un vector, que contienen todas las posibles soluciones. Una vez que se ha encontrado la solución, el bucle continuará inspeccionando el resto de los elementos que todavía no hayan sido evaluados. Pero si solo hay una solución, estas iteraciones del bucle son innecesarias, ya que sabemos que la solución no estará en esos valores. En este tipo de programas, es mejor interrumpir el bucle y dejar de hacer iteraciones. El uso de interrupciones de bucles debería ser minoritario. Los programas que abusan del uso de interrupciones son más difíciles de entender, y más propensos a contener fallos.

1 Requisitos previos

Es importante haber realizado las dos prácticas sobre bucles con anterioridad a esta práctica:

2 Vídeos posteriores

Tras realizar esta práctica, el siguiente vídeo te ayudará a afianzar conocimientos:

3 Comandos que se aprenderán en esta práctica

break continue

4 Contenido de la práctica

4.1 Primeros pasos con break

Vamos a ver primero un pequeño ejemplo de un programa que usa un bucle con interrupción, para ilustrar su uso. Primero, creamos un vector aleatorio con 20 elementos, entre 0 y 10 y sin parte decimal. Luego usamos un bucle para recorrer el vector y buscar la primera posición que contiene un número impar. Mientras el bucle no encuentre un número impar, sigue funcionando, escribiendo los números que va encontrando en la pantalla:
v = fix(rand(1,20)*10); % Vector con 20 elementos entre 0 y 10
n = length(v); % Número de elementos del vector

for k=1:n
  disp(v(k));
  if rem(v(k),2) ~= 0
    fprintf('He encontrado el primer número impar en la posición %d\n', k);
    break; % El bucle termina aquí
  end
end

Si ejecutamos este programa muchas veces, cada vez obtendremos un resultado diferente. Es muy importante entender que esto solo es un ejemplo de cómo funciona break. Este programa tendría un mejor diseño si se realizara con un bucle while (mientras no encuentres un impar, sigue recorriendo el vector).

Lapiz.png Tarea: Transforma el programa anterior para que use while, y no use ni for ni break


=== Primeros pasos con continue


4.2 Ejemplo real de uso de break: encontrar si un número es primo

Una vez que hemos entendido cómo funciona break, vamos a aplicarlo a un caso real. Se trata de averiguar si un número es primo. Recordemos que un número es primo si solo se puede dividir por 1 y por sí mismo. Los divisores de un número tienen que ser necesariamente menores que ese número. Por tanto, nuestro programa probará todos los números más pequeños que nuestro número, y si encuentra alguno que lo divida, entonces resulta que el número no es primo. Veamos el código:
n = input('Introduce el número para probar si es primo: ');

for k=2:(n-1)
  % Si el número k divide a n, no es primo
  if rem(n,k) == 0
    fprintf('El número %d no es primo\n', n);
    break; % No hace falta seguir buscando números
  end
end

Si hay algún número k entre 2 y n-1 que divide a n, entonces el número n no puede ser primo. En el momento que hemos encontrado ese número k ya no es necesario probar más divisores, por eso paramos el bucle usando break.

Lapiz.png Tarea: El programa anterior no se ajusta bien a la estructura entrada-algoritmo-salida. Modifica el programa anterior para usar una variable bandera, de nombre esPrimo. Inicialmente esta variable valdrá true, y cambiará su valor si se encuentra un divisor de n. Si no se encuentra ningún divisor, esPrimo no cambiará de valor, y tendrá el valor true, que era el valor inicial. En la salida de datos, según esPrimo sea verdadero o falso, el programa debe mostrar que el número es primo o no.


5 Ejercicio post-práctica

Una vez que hayas realizado el programa con la variable bandera esPrimo, aprovecha esa variable para transformar el programa anterior, y que use while sin necesidad de usar break.