¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Algoritmia
  3. Bucles
Extrait - Algoritmia Técnicas fundamentales de programación – Ejemplos en Python (numerosos ejercicios corregidos) (Nueva edición)
Extractos del libro
Algoritmia Técnicas fundamentales de programación – Ejemplos en Python (numerosos ejercicios corregidos) (Nueva edición) Volver a la página de compra del libro

Bucles

Estructuras iterativas

1. Iterar para programar mejor

En el capítulo anterior, aprendimos a guiar nuestro algoritmo para probar condiciones para ejecutar o no instrucciones. Este fue el primer paso importante para informar a la máquina lo que debía hacer y, sobre todo, cuándo hacerlo. Ahora vamos a pasar al segundo paso esencial: las iteraciones.

Volvamos a los dos ejemplos del primer capítulo: las instrucciones de montaje de un mueble en kit y la receta de una tarta de manzana.

En las instrucciones de montaje, a menudo se nos pide que repitamos las mismas acciones utilizando los mismos tipos de piezas. Un ejemplo se muestra en el siguiente diagrama: se nos pide que insertemos cuatro tornillos en un tablero y que lo hagamos para los cuatro tableros. Se trata de la misma acción, que se debe realizar cuatro veces, es decir, una iteración de cuatro vueltas. El x4 de la figura indica este número de iteraciones y nos parece significativo y perfectamente lógico. Ya veremos cómo traducirlo para el ordenador en el resto de este capítulo.

images/04RI01.png

Un paso en las instrucciones de montaje de los muebles en kit

Para la receta de cocina, las repeticiones se encuentran en la gestión de las manzanas: para cada manzana, pelarla y cortarla en rodajas que se colocarán en la tarta. No dejamos de hacer esto mientras queden manzanas para la tarta. También podemos decir que continuamos estas acciones hasta...

Mientras

1. Principio y sintaxis

Podemos comparar el MIENTRASQUE con un SI ENTONCES que se repite mientras la condición sea válida. Esta estructura realiza un número indefinido de iteraciones en función de la validez de la condición. Estas iteraciones solo se detienen cuando la condición deja de ser válida.

Las instrucciones a repetir se encuentran en el bloque de esta estructura:

MIENTRASQUE (condicion)  
HACER  
   ...   // resto de instrucciones a repetir  
FINMIENTRASQUE 

Volvamos a la cocina con nuestra tarta de manzana. Una forma de manipular las manzanas con esta estructura sería la siguiente:

MIENTRASQUE queden manzanas  
HACER  
   Coger una manzana  
   Pelar la manzana  
   Cortar la manzana en rodajas  
FINMIENTRASQUE 

La dificultad con MIENTRASQUE es encontrar la condición correcta que se debe probar. Si esta condición se satisface siempre, su iteración será infinita, nunca se detendrá y su programa permanecerá bloqueado en las instrucciones del bloque, sin terminar nunca. Si la condición no se cumple nunca, el bucle no se ejecuta ni una sola vez. Esto es lo que los desarrolladores llaman un bucle infinito.

Veamos ahora MIENTRASQUE en algoritmos concretos.

2. Ejemplos

Un ejemplo sencillo de MIENTRASQUE es hacer...

Repetir ... hasta

1. Principio y sintaxis

REPETIR HASTA se puede considerar como un MIENTRASQUE invertido: las instrucciones se repiten una vez antes de comprobar la condición. Sea cual sea la validez de la condición, las instrucciones del bloque se ejecutan necesariamente una vez.

REPETIR  
   ...   // resto de instrucciones a repetir  
HASTA (condicion) 

Nuestra segunda versión para gestionar las manzanas de nuestra tarta es la siguiente: 

 
REPETIR  
HACER  
   Coger una manzana  
   Pelar la manzana  
   Cortar la manzana en rodajas   
HASTA no queden manzanas 

Podemos ver que las condiciones para MIENTRASQUE y REPETIR HASTA son condiciones inversas. Estamos comprobando si queda alguna manzana con la condición MIENTRASQUE, mientras que estamos comprobando si no queda ninguna manzana con la condición REPETIR HASTA.

2. Ejemplo

Corrijamos nuestro menú con esta nueva estructura iterativa:

PROGRAMA Menu  
VAR  
   respuesta : CADENA  
INICIO  
   REPETIR  
      ESCRIBIR("¿Desea continuar? (sí/no)")  
      respuesta <- LEER()  
   HASTA respuesta = no 
FIN 

Con este algoritmo...

Para

1. Principio y sintaxis

La estructura iterativa PARA corresponde al caso de repetición de las instrucciones de montaje de muebles kit. El bloque de instrucciones se repite un número específico de veces, determinado antes de la estructura.

PARA se debe utilizar siempre con una variable que nos permita saber en qué número de iteración nos encontramos: el contador, comúnmente conocido como i en programación.

Este contador debe empezar de un valor inicial y terminar en un valor final. Cuando supera este valor final, las iteraciones se detienen y se ejecuta el resto del programa.

Para pasar del valor inicial al valor final, es necesario declarar un paso que especifica cómo cambiará de valor el contador de una iteración a la siguiente. Este paso se aplica en cada iteración y debe ser un número entero, positivo o negativo. El valor del paso se añade automáticamente al contador en cada nueva iteración.

Si quiere escribir un PARA decreciente, que por lo tanto decrementa el contador, lo único que tiene que hacer es declarar un paso negativo.

VAR contador : ENTERO  
PARA contador DESDE ... a ... CON INCREMENTO DE ...  
HACER   
   ...   // resto de instrucciones a repetir 
FINPARA 

Modelemos las instrucciones de montaje como un algoritmo:

PROGRAMA Notice  
   contador...

Estructuras iterativas anidadas

Hemos simplificado demasiado nuestros dos algoritmos cotidianos. De hecho, hay un proceso que hacer para cada rodaja de manzana en la receta y otro para cada tornillo en las instrucciones de montaje. Así que necesitamos una iteración en otra.

Al igual que con la estructura condicional SI, se pueden anidar estructuras iterativas dentro de otras y anidar condicionales dentro de iterativas y viceversa. Las posibilidades de anidamiento son infinitas, lo que nos permite escribir programas complejos que resulten interesantes para el usuario.

Veamos nuestros dos ejemplos con más detalle, anidando una estructura iterativa dentro de las ya existentes:

PROGRAMA receta_tarta_manzanas  
MIENTRASQUE hay manzanas  
HACER  
   Coger una manzana  
   Pelar la manzana  
   Cortar la manzana en rodajas  
   REPETIR  
      Colocar la rodaja en la tarta  
   HASTA no haya rodajas  
FINMIENTRASQUE 

PROGRAMA Instrucciones_completadas  
   i, j : ENTERO  
INICIO  
   PARA i DESDE 1 a 4 CON INCREMENTO DE 1  
   HACER  
      PARA j DESDE 1 HASTA 4 CON INCREMENTO DE 1  
      HACER  ...

Cuidado, peligro

El primer peligro de las estructuras condicionales es el bucle infinito. Necesita estar seguro de que su condición de salida se validará durante la ejecución del algoritmo o de que tu contador alcanzará el límite máximo.

Veamos dos ejemplos de bucles infinitos.

El primero es un recuento con el bucle MIENTRASQUE:

PROGRAMA Contar_infinito  
VAR  
   cont : ENTERO <- 1  
    limite : ENTERO  
INICIO  
   ESCRIBIR("Escriba un número superior a 1")  
    limite <- LEER()  
   MIENTRASQUE cont   limite  
   HACER  
      ESCRIBIR(cont)  
   FINMIENTRASQUE  
FIN 

Este algoritmo nunca incrementa el valor de la variable cnt. Como resultado, el valor de esta variable siempre será diferente del de la variable correspondiente y las iteraciones nunca se detendrán, por lo que se mostrará un 1 en el infinito.

Si tiene un número fijo de iteraciones, utilice siempre una estructura PARA.

La segunda es una ligera modificación de nuestra tabla de multiplicar:

PROGRAMA Tabla_multiplicacion_infinito  
   i : ENTERO  
   entrada_usuario : ENTERO  
INICIO  
   ESCRIBIR("¿Qué...

Iteraciones en python

1. Para

Una de las características especiales del lenguaje Python es la estructura PARA. En algoritmia, esta estructura necesita un contador, un valor inicial y un valor final para este contador y un paso. Python traduce esta estructura como PARA CADA.

El PARA CADA de Python itera sobre un conjunto de valores y pone cada uno de estos valores en una variable, uno por iteración.

Su sintaxis es la siguiente:

for variable in conjunto_valores :  
   # bloque de instrucciones a repetir 

Empecemos iterando sobre una cadena de caracteres (que es un conjunto de caracteres):

for carac in "hello world" :  
   print(carac, end="")  
print()  # un salto de línea adicional para la visualización 

El for anterior muestra cada carácter de la cadena hola mundo en una línea, uno detrás de otro.

¿Cómo podemos utilizar PARA CADA para escribir nuestro FOR? Para ello, existe una instrucción especial en Python que da un conjunto de valores numéricos: el rango.

El rango recibe como mínimo un parámetro que especifica el límite máximo del conjunto. range(10) nos dará los diez primeros enteros. Este límite no se incluye en el conjunto de valores devueltos.

Por defecto, range empieza con el valor inicial 0. Si desea comenzar con otro valor inicial, debe especificarlo como primer parámetro: range(1,11) devuelve los 10 primeros enteros positivos.

Para cambiar el paso, que por defecto es 1, hay que añadir un tercer parámetro: range(1, 11, 2) da los cinco primeros enteros impares.

Así que vamos a utilizar este rango para escribir nuestra estructura iterativa...

Ejercicios

1. Ejercicio 1

Escriba un algoritmo que muestre los veinte primeros términos de la tabla de multiplicar, marcando los múltiplos de 3 con un asterisco. Codifique el script Python correspondiente.

2. Ejercicio 2

Escriba un algoritmo que calcule la multiplicación de dos enteros introducidos por el usuario sin utilizar el operador x (es decir, con sumas sucesivas). Codifique el script Python correspondiente.

3. Ejercicio 3

Escriba un algoritmo que recupere repetidamente una cadena de caracteres introducida por el usuario y muestre su longitud hasta que esta entrada coincida con la palabra "fin". Codifique el script Python correspondiente.

4. Ejercicio 4

Escriba un algoritmo que muestre los n primeros cuadrados, donde n es un número entero introducido por el usuario. Codifique el script Python correspondiente.

5. Ejercicio 5

Escriba un algoritmo que implemente el juego FizzBuzz: muestra los cien primeros números enteros sustituyendo los múltiplos de tres por Fizz, los múltiplos de cinco por Buzz y los múltiplos de quince por FizzBuzz. Codifique el script Python correspondiente, añadiendo que los saltos de línea solo se producen después de los múltiplos de diez.

6. Ejercicio 6

Escriba un algoritmo que determine si una cadena es un palíndromo, es decir, una palabra que se puede leer tanto de izquierda a derecha como de derecha a izquierda. Codifique el script Python...