Saltar la navegación

3.1. Estructuras para desarrollar nuestro contenido

Rétor explica lo que vamos a conocer.Como habrás comprobado a través de los conocimientos que hemos trabajado en este curso y con las actividades anteriores, con el sólo uso de operadores, variables y constantes la programación de aplicaciones es muy limitada. Necesitamos realizar a veces funcionalidades más complejas que implican toma de decisiones o repetición de de acciones mientras dure unas determinadas circunstancias. Por eso, ahora vas a avanzar en la programación conociendo mecanismos que nos permiten esto: las estructuras de control.

1. ¿Sin comentarios?

Imagen de ProgramadoresCuando la persona programadora está codificando su programa se enfrenta habitualmente a dificultades que debe resolver en el código para obtener el resultado deseado. Para ello es una buena práctica realizar comentarios en el código que expliquen por qué se está utilizando cierto comando o un bloque de ellos. Es por eso que los lenguajes de programación tienen determinados caracterres para indicar que lo que hay a continuación no es código ejecutable, sino información al usuario programador.

Anteriormente hemos utilizado los comentarios de Pyhton, ¿recuerdas sus símbolos? ¡Probad en grupo a intentar localizar el error en el siguiente programa!:

Programa con errores a descubrir

Estas preguntas os ayudarán a analizar el programa y a detectar los errores:

  • ¿Qué hace este programa? ¿Reconocéis la estructura de bucle que hay? Tratad de escribir un pseudocódigo del mismo.
  • ¿Qué error lanza cuando se intenta ejecutar tal cómo está? Según el mensaje de error que os aparece, ¿a qué puede deberse el error?
  • ¿Cómo lo corregiríais? Tratad de modificar el programa hasta que os resulte el funcionamiento deseado (OJO: Puede tener varios errores).

¿Recuerdas los símbolos de comentario en Python?

Comentario para hash

  • Las líneas que comiencen por un símbolo de # o hash se consideran comentarios, es decir, el programa no lee esos caracteres como instrucciones a ejecutar. Entonces, escribiendo este símbolo al inicio de la línea de texto tenemos toda la línea comentada.
  • Si en vez de # utilizamos la triple comilla (tres veces ') al principio y al final del comentario, tendremos todo ese texto comentado, aunque ocupe varias líneas.

Recuerda: En los comentarios se puede escribir texto con acentos, eñes y cualquier carácter internacional. Pero en los nombres de las variables se recomienda usar sólo el alfabeto inglés en todos los lenguajes de programación.

2. Python se expresa: usa operadores

Nuestro lenguaje de programación utilizado, Python, nos muestra siempre sus resultados en función de las órdenes que le indicamos. Estás órdenes le llegan a través de los operadores que conocemos. Cualquier variable acompañada de un operador ya constituye una expresión. Recuerda los operadores proporcionando un resultado a las siguientes expresiones (utiliza para cada evaluación de los valores de las variables el valor con el que han quedado en el caso anterior).

Sugerencia: Abre tu terminal de Python y prueba, si lo necesitas, las opciones que se te proponen.

>>> hola='Hola'
>>> python='caracola'
>>> print (hola+' '+python)

>>> x = True
>>> y = False
>>> x or y

>>> x and y

>>> not x

>>> x = 9
>>> y = 1
>>> x or y

>>> x and y

>>> ~x

>>> x > y

>>> x == y

>>> 1 < x and x < 20

>>> 1 < x < 20

>>> x = 7
>>> y = 2
>>> x + y

>>> x * y

>>> x % y

>>> x // y

Habilitar JavaScript

3. ¿Tengo lo que necesito?

Estructuras de programaciónQuizás te hayas dado cuenta de que con las herramientas vistas hasta ahora (instrucciones simples, operadores...) no podemos plasmar en un programa todo funcionamiento deseado o requerido:

  • A veces es necesario presentar opciones al usuario para que seleccione una entre varias, y actuar de una manera u otra en función de lo que elija.
  • Otras veces hay que repetir un conjunto de instrucciones para todos los casos existentes (y tan numerosos que resultaría imposible repetir las instrucciones individualmente) o bien, continuar calculando hasta que se cumpla una condición, durante un periodo de tiempo indifinido.

¿Cómo podrías programar estos casos? La respuesta nos la da la programación estructurada al ofrecernos dos tipos de estructuras que resuelven cada una de estas necesidades: las estructuras de Toma de Decisiones y las estructuras de Bucle. ¡Vamos a verlas a continuación!

Es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora recurriendo únicamente a subrutinas y tres estructuras básicas: secuencia, selección (if y switch) e iteración (bucles for y while).

4. Controlamos...con condiciones.


En nuestro reto hablamos de programar un sistema de reservas de butacas en un cine. Pero, para implementarlo al uso necesitaremos preguntar al usuario qué acción desea realizar entre varias posibles: ver el patio de butacas, seleccionar la reserva, terminar la sesión... Para esto tendremos que presentarle opciones y realizar unas acciones u otras en función de su elección. Conozcamos las distintas opciones de estructuras de condición y cómo aplicarlas:

IF

Esta estructura se llama también "si condicional". Para utilizarla debes seguir el siguiente esquema:

if condicion :\n       comandoEn esta estructura de la izquierda tienes en color morado los caracteres reservados de Python que debes utilizar y en rojo los que deberás sustituir por las necesidades de tu programa.

Por ejemplo: Si queremos saber si el usuario ha marcado la opción primera de Ver asientos libres, pulsando el 1, podremos comprobarlo así:

if opcion == 1 :         print (

¡Atención! También puedes incluir más de una orden al cumplirse la condición. Lo único que se tiene que cumplir es que aparezcan tabuladas más a la derecha, para que el programa las reconozca como órdenes juntas dentro de la condición:

>>> if opcion == 1 :
print ("Ha seleccionado ver asientos libres.\n")
print ("Pulse Intro para continuar")
*El símbolo \n es un carácter de control que el ordenador interpreta como un cambio de línea.

ELSE

Puede que nos interesa, cuando no se cumple la condición por la que preguntamos, que el programa realice otra acción. En este caso se utiliza la cláusula "else". Puedes ver aquí el esquema de uso y un ejemplo:

En eif condicion:\n    comando1\n    \nelse :     comando2sta estructura de la izquierda tienes en color morado los caracteres reservados de Python que debes utilizar y en rojo los que deberás sustituir por las necesidades de tu programa.

Por ejemplo: Si queremos comprobar que el usuario introduce lo que se le pide (control/verificación de datos de entrada), podemos utilizar esta estructura. Compruébalo con el siguiente ejemplo:

Estructura IF-ELSE

*Nota: En el ejemplo aplicamos la función "int" al dato de entrada por teclado para asegurarnos de que es un número enteroy que el programa puede así funcionar correctamente.

ELIF

if condicion :\n    comando1\nelif condicion2 :\n    comando2\nelif condicion3 :\n    comando3\else :\n     comando final #El comando final se ejecuta cuando no se cumplan ninguna de las condiciones anteriores.Hay algunas aplicaciones que necesitan varias estructuras IF anidadas. Esto significa que preguntaremos si se cumple una condición y en caso contrario, volveremos a preguntar si entonces se cumple otra, y en caso contrario volveremos a preguntar...así hasta cubrir el rango que necesitamos.
¿Recuerdas el programa del dado que desarrollamos en el REA anterior? En un caso así puede necesitarse para controlar la puntuación que se ha obtenido. De este modo, haría falta controlar cada uno de los seis casos posibles para realizar una acción u otra.
Como en cada IF hay que tabular los comandos internos hacia la derecha el programa puede resultar complicado de leer y no muy estético a la vista. Entonces se utiliza el comando ELIF: este une el caso contrario ELSE con el siguiente IF anidado en un solo comando.

Por ejemplo:

Vamos a ver cómo se trataría el caso de realizar alguna acción en función del valor que resulta en la tirada del dado. A continuación te mostramos las dos posibilidades, ambas correctas, para diferenciar según el valor obtenido al tirar el dado. ¿Qué formato crees que queda más ordenado y más claro en el código de un programa?:

Estructura de IF anidados sin ELIF
Estructura de IF anidados con ELIF

Condiciones encadenadas

El operador AND tiene significado Y. El operador OR tiene significado O. El operador NOT tiene significado NO.A veces necesitamos encadenar varias condiciones para que se comprueben a la vez en la misma condición. Esto lo realizaremos mediante los operadores lógicos: and (y), or (o), not (no).

  Por ejemplo: Imagina que queremos programar una apuesta donde el ganador es el segundo número más alto entre 1 y 10 de entre tres números que se piden por teclado. Hay que realizar entonces un programa donde se realicen comparaciones simultáneas. Puede haber varias soluciones, ¡aquí tienes una propuesta que te resuelve este ejemplo!

Varias condiciones

Expresiones condicionadas

Debes saber que existe otra forma en Python de expresar esta estructura condicional. Se trata de comenzar asignando el valor a una variable si se cumple la condición expresada después. Hay que indicar que esta estructura suele resultar algo más confusa que las anteriores.

variable=valor 1 if condición else valor 2

Por ejemplo: si queremos saber cuál es el mayor de dos números x e y, expresaríamos en Python mediante esta estructura

mayor = x if x>y else y

5. Ya conoces los más famosos

Logo IFSi pensabas que la estructura condicional IF es demasiado simple, ahora te convencerás de la importacia que tiene. Ojo a estas aplicaciones que tiene actualmente esta estructura. ¿Te atreves a observarlas para analizar su funcionamiento? Identifica la estructura IF, la condición y los comandos.

Comprobación de URL

Ejemplo Real: Controlar formato URL

Aquí puedes ver un trozo de código que utiliza la estructura IF para comprobar si una URL introducida tiene la estructura correcta y será un enlace real. Se utiliza en formularios que solicitan a los usuarios una dirección web y si el formato no es correcto, lanza un aviso por pantalla.

Estado de la impresora

Ejemplo Real: Controlar estado impresora

En este caso que presentamos podemos observar el comportamiento de la comprobación de estado de una impresora: según la señal de estado hardware que recibe se discrimina (con IF anidados) si está preparada, si está sin papel, si está apagada...

Domótica: control de presencia

Ejemplo Real: Controlar presencia

Con este sencillo código, al recibir la señal de un sensor de presencia, se puede avisar por SMS de la presencia de una persona.

Acceso por edad

Ejemplo Real: Controlar edad

En este pseudocódigo comprobamos la codificación de una estructura condicional IF para realizar una serie de acciones si se cumple el requisito de edad. Es el código utilizado por multitud de páginas web para permitir el acceso a sus contenidos.

6. Estamos entrando en bucle

Con frecuencia, al programar, tendremos que repetir un conjunto de instrucciones para cubrir todos los casos posibles en la búsqueda de un resultado o para realizar un cambio. Además, en múltiples ocasiones será necesario comprobar las condiciones de manera repetida combinando la estructura condicional que acabamos de ver antes con la de bucle. Veamos las opciones que tenemos disponibles en Python.

WHILE

Esta estructura nos marca una parte de programa que se repite mientras se cumpla una cierta condición. Fíjate en su estructura, verás que de nuevo el conjunto de comandos que se ejecutan mientras se cumple la condición deben estar indentados:

while condicion:\n     comandos En esta estructura de la izquierda tienes en color morado los caracteres reservados de Python que debes utilizar y en rojo los que deberás sustituir por las necesidades de tu programa.
Por ejemplo: En nuestro proyecto de reserva de asientos tendremos que seguir ofreciendo al usuario una serie de opciones mientras que no nos indique que desea finalizar su sesión. Para ello habrá un valor que indique la opción salir y seguiremos dentro del programa mientras no se seleccione:
opcion=0 while opcion != 3 :     print(
¡Recuerda!: No olvides probarlo tu terminal de Python.

Contando con WHILE

Una de las aplicaciones más útiles de la estructura WHILE es su uso como contador. Y ¿qué es un contador? Es una variable que incrementa su valor en 1 para averiguar cuántas veces ha ocurrido algo utilizando para ello una estructura de bucle.

¿Quieres ver un ejemplo? A continuación te mostramos el siguiente programa en Python que utiliza dos variables propias de la estructura while:

  • Un contador, que cuenta el número de veces que se lanza un dado.
  • Un acumulador: es una variable que almacena los valores que van resultando.

¿Sabrías decir qué variable es el contador y cuál el acumulador?

PROGRAMA

import random

print ("Comienzo\n")
total=0
tiradas=0
while total<=10 :
   dado=random.randint(1,6)
   print ("\nHa salido un", dado)
   total=total+dado
   tiradas=tiradas+1
print ("El total de puntos acumulado es de", total)
print ("\nSe ha alcanzado en",tiradas,"tiradas.\n")

RESULTADO

Resultado del programa contador

Observa: Para facilitarnos la lectura y ejecución de programas, el IDLE de Python cambia el color de las palabras reservadas para la programación en función de si son palabras de estructuras, si son comandos y también indica las cadenas de caracteres. ¡Compruébalo tú mismo escribiendo el programa anterior en tu ordenador!

FOR

A veces resulta necesario o útil realizar una serie de operaciones un número previamente conocido de veces o recorrer una lista incrementando una a una la posición automáticamente. Para ello utilizamos el comando FOR, que también es un bucle muy utilizado en programación.

En Python el comando for utiliza la función range: esta función realiza un recorrido por todos los valores entre el inicio y el final que se indican en la propia función. El incremento por defcto es de 1 en 1, aunque se puede indicar otro incremento especificándolo como tercer dato. ¡Compruébalo en el ejemplo, que te será de utilidad para tu reto! ¿Qué hace este programa?:

PROGRAMA

print ("Comienzo\n")
butacas = [0,0,1,1,1,0,0,0,0,1,1,0,0,0]
numero = input("¿Cuántas butacas desea en la fila?\n")
contador = 0
libre = "no"
for i in range (1,14):
if (butacas[i] == 0) :
contador = contador + 1
if (numero == contador):
libre = "sí"
else :
contador = 0
if libre == "sí" :
print ("Hay suficientes butacas disponibles.")
else :
print ("No hay suficientes butacas seguidas.")

RESULTADO

Resultado del ejemplo de uso de FOR

¿Recuerdas?: En el ejemplo propuesto verás que la variable butacas es una variable de tipo lista. Vimos una breve introducción al uso de estas variables en el REA anterior, pero ¡tranquilo si no lo recuerdas! Las veremos más a fondo en el próximo apartado.

Alerta de bucle infinito

¡Cuidado con los bucles infinitos! A veces, por error en el uso de la condición o porque interesa en alguna aplicación se puede crear un bucle infinito: es cuando la condición siempre se cumple y el bucle nunca acaba.

Normalmente lo encontrarás en la estructura while, ya que la estructura for incrementa su contador entre un principio y un final.

Imagina que programamos un acceso por contraseña. Una posible estructura para permitir que un programa se ejecute sólo si se averigua una contraseña puede ser la siguiente. Ejecuta este programa en tu IDLE para saber el resultado.

Observa: Si no se averigua la contraseña, nunca terminará de ejecutarse, será infinito.

PROGRAMA

bloqueado = 1
while bloqueado==1 :
password = input ("Introduzca la contraseña.\n")
if password=="CONTRASEÑA" :
print ("Correcto.\n")
bloqueado = 0
else :
print ("Contraseña incorrecta.\n")
#Continúa ahora el resto del programa.

Necesitaríamos ponerle un fin y para ello Python nos da dos opciones:

  • La primera ya la conocemos: poner un contador y dar un número limitado de intentos. Cuando se terminen los intentos, se termina el programa.
  • Utilizar la orden break: esta orden interrumpe un bucle si se ejecuta. Podríamos dar la oportunidad al usuario de querer salir si se introduce la palabra SALIR. En ese caso, dentro del while la condición se convertiría en:
bloqueado = 1
while bloqueado==1 :
password = input ("Introduzca la contraseña.\n")
if password=="CONTRASEÑA" :
print ("Correcto.\n")
bloqueado = 0
elif password=="SALIR" :
break
else:
print ("Contraseña incorrecta.\n")

Ten en cuenta: En ambos casos de estas dos últimas opciones, para continuar el programa necesitaríamos entonces una estructura condicional posterior que permita seguir con el programa si la variable bloqueado=0 (se ha introducido la contraseña correcta).

¿Te ayudo con el bucle?

La siguiente animación puede ayudarte con la comprensión del funcionamiento de una bucle en programación. En este diagrama se incluyen la asignación y posterior modificación de las variables de control de condición que influyen en el funcionamiento del bucle. ¡Seguro que aplicar este diagrama a la lógica de funcionamiento te resulta útil en los programas a partir de ahora!

DIAGRAMA DE FLUJO: BUCLE WHILE Haga clic en los botones de avance y retroceso para ver la ejecución paso a paso El programa llega al bucle while. INICIO Efectúa la asignación. ASIGNACIÓN Evalúa la condición ... CONDICIÓN Si la condición es True, ejecuta el bloque ... True BLOQUE ... efectúa el cambio ... CAMBIO y vuelve a evaluar la condición. CONDICIÓN Si la condición es False, termina el bucle while.. False FIN El programa llega al bucle while. INICIO Efectúa la asignación. ASIGNACIÓN Evalúa la condición ... CONDICIÓN Si la condición es True, ejecuta el bloque ... True BLOQUE ... efectúa el cambio ... CAMBIO y vuelve a evaluar la condición. CONDICIÓN Si la condición es False, termina el bucle while.. False FIN

Animación adaptada de por Bartolomé Sintes Marco con licencia CC BY-SA 4.0

7. Un paso más: anidamos los bucles

Las 4 butacas: el programa.Acabamos de conocer cómo realizar en Python operaciones que requieren repetir conjuntos de instrucciones mientras se cumpla una condición o realizar unas operaciones u otras en función de si se cumple o no la condición.

¡Vamos a ponerlo en práctica! Para ello te proponemos los dos ejercicios a continuación. Intenta completarlos individualmente. Si necesitas ayuda, consulta los consejos que se dan y por supuesto, ¡no olvides preguntar si te hace falta!

Teniendo en cuenta que en este REA programaremos un sistema de reserva de butacas de un cine, vamos primero a conocer de cuántas maneras diferentes se pueden ocupar 4 butacas por cuatro personas utilizando las estructuras vistas y apoyándonos en el vídeo que presenta este apartado y nos da una visión de los bucles anidados.

7. A - Las opciones me las dan las matemáticas

Pregunta

Efectivamente, el factorial de un número nos da los casos posibles resultado del problema planteado. En este caso, es el factorial de 4, es decir, 4! ¿Cuál de estos códigos Python me daría la respuesta correcta?

Respuestas

n = 4
total = 1
    while n > 1:
        total *= n
        n -= 1
print (total)

from math import factorial
factorial(4)

print(4 * 3 * 2 * 1)

Todas las anteriores son correctas.

Retroalimentación

7. B - Ocupamos 4 butacas: ¿Cuántos casos tenemos?

Tenemos cuatro usuarios que van a ocupar 4 butacas en un cine: Vicky, Juan, Pepe y Sergio. ¿De cuántas maneras diferentes pueden ocupar estos sitios?

Veamos:

  • Plantearemos el problema asignando una variable a cada persona y un número a cada butaca. De esta manera nuestras variables serán: V, J, P y S; y las butacas serán las butacas número 1-2-3-4.
  • También haremos uso de un contados que irá sumando 1 cada vez que encontremos una nueva forma de ocupar las butacas. Esta variable será contador.
  • Estructuramos el ejercicio de la siguiente manera:
    • La primera persona (V) irá recorriendo cada uno de los 4 asientos disponibles que tiene.
    • La segunda persona (J) tendrá disponibles 3 posibles asientos una vez que la 1ª personas esté sentada.
    • La tercera pesona (P) tendrá entonces 2 posibles asientos para ir cambiando, una vez esté sentada la 2ª persona.
    • La cuarta persona (S) no necesita bucle porque su posición quedará determinada por defecto por la silla que quede libre.

Pseudocódigo del problema butacas

Visto el pseudocódigo, implementa el programa en Python que muestre al final "Las distintas posibilidades son X". ¡No olvides probarlo en tu IDLE para comprobar el resultado!

¿Quién es quién?

Tras realizar este ejercicio, ¿sabrías cómo se llama cada muñeco del vídeo de portada del apartado? Es decir, ¿a qué muñeco correspondería la variable V, a cuál la J y a cuál las P y S?

7. C - Ocupamos 4 butacas: ¡Mira las posibilidades!

¡Vamos a por más posibilidades!:

Resultado por pantallaAhora, haremos que el programa muestre por pantalla el rango completo de posibilidades. De nuevo, necesitarás las estructuras vistas anteriormente. Esta vez debes estructurar tu propio pseudocódigo para el algoritmo, pero no te preocupes, aquí tienes unas recomendaciones para afrontar este desafío:

  • Te será mucho más cómodo utilizar bucles for.
  • Como debes mostrar qué asiento ocupa cada personaje, todos los bucles for que utilices deben recorrer el rango completo. Es decir, todos deben ir desde el valor 1 que representa la primera butaca, hasta 4 que representa la última.
  • Orden continue: ¡Esta orden no la conoces y te proporcionará una gran ventaja! Cuando la pones, el bucle se "salta" esa iteración: no ejecuta las instrucciones a continuación, sino que incrementa el valor del índice de la condición del bucle y sigue repitiendo el resto de iteraciones restantes.

¿Quieres alguna pista?

  • Como todos los personajes deben recorrer todas las posiciones desde 1 hasta 4. Si la posición coincide con la de alguno de los personajes de bucles superiores, usa la orden continue dentro del bucle para no tener en cuenta ese caso:

if (P==V) or (P==J)
   continue
print ("Otra posibilidad es V=",V,", J=",J,", P=",P,"\n")

  • La posición del cuarto personaje vendrá determinada por la que ocupen los demás. Fíjate en que si sumamos los valores de todas las posiciones: 4+3+2+1=10 y si sumas las tres que estén ocupadas, la resta entre 10 y ese valor te dará la posición que queda por ocupar (la del último personaje).

¡Seguro que te interesa esta curiosidad!

La función de cadena de formato f

La función f te facilitará mucho sacar información por pantalla. En los ejemplos anteriores has visto que si queremos sacar por pantalla el valor de alguna variable, teníamos que:

  1. Cerrar las comillas del texto y poner coma seguida de la variable.
  2. Otra opción era utilizar los identificadores de formato:
    valor = 3
    decimal = 0.4
    cadena = "Hola"
    print ('La variable entera vale %i, la decimal %f y la cadena de caracteres %s' %(valor, decimal, cadena))

Para saber másAhora Python nos ofrece una forma mucho más sencilla gracias a la función de cadena de formato f. En este nuevo modelo, la función f devuelve el valor de una variable de manera que la evalúa esté donde esté siempre y cuando la situemos delante y el nombre de las variables entre llaves (si queremos mostrar también el nombre de la variable, utilizamos una doble llave). Así, podríamos escribir mucho más fácilmente:

valor = 3
decimal = 0.4
cadena = "Hola"
print (f'La variable entera vale {valor}, la decimal {decimal} y la cadena de caracteres {cadena}')