¡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. Subprogramas
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

Subprogramas

Procedimientos y funciones

Todavía estás aprendiendo a modelar su pensamiento en informática utilizando problemas bastante sencillos. En este capítulo va a llevar su pensamiento un paso más allá. Imagine un programa como un software de vídeo a la carta o un cliente de correo electrónico. ¿No cree que estos programas contienen millones, incluso miles de millones de instrucciones? Entonces, ¿cómo es posible orientarse en este enjambre de instrucciones?

La primera respuesta es muy sencilla: es necesario descomponer su lógica en pequeñas partes, que se llamarán bajo demanda. Esto reduce enormemente la complejidad del programa al centrarse solo en subproblemas más sencillos de resolver. Estas partes son los subprogramas que se llamarán en el programa principal, el punto de acceso de la aplicación, como se muestra en la siguiente figura.

images/cap6_pag1.png

Programa principal y subprogramas

En los algoritmos, las subrutinas se declaran antes del programa de la siguiente manera:

SUB-PROGRAMA sub_prog_A   
VAR   
   ...  
INICIO   
   ...  
FIN   
PROGRAMA principal   
VAR   
   ...  
INICIO   
   ...   
   sub_prog_A  
FIN 

En realidad, un programa rara vez se compone de una única serie de instrucciones que se suceden unas a otras. Para crear y mantener correctamente una aplicación, los desarrolladores siempre dividen el programa principal en una serie de subprogramas, que luego se llaman por desde el programa principal. Los subprogramas representan una pequeña parte de la funcionalidad del programa. También se pueden llamar entre sí para definir una jerarquía de tareas.

Vamos a considerar como ejemplo un juego sencillo: el ahorcado. Desglosémoslo en sus funcionalidades:

  • Introducir la palabra que desea adivinar.

  • Inicializar la palabra oculta.

  • Iniciar del juego:

  • Mostrar la palabra oculta.

  • Introducir la letra del usuario.

  • Tratar la palabra oculta y número de ensayos.

  • Probar para determinar si la palabra se encuentra o no.

Con este desglose, podemos ver que no estamos abordando todo el juego del ahorcado a la vez, sino construyéndolo paso a paso, característica a característica....

La elegancia de la recursividad

Por definición, un subprograma recursivo es un subprograma que se llama a sí mismo.

En teoría, el objetivo de la recursividad es simplificar un proceso complejo que contenga iteraciones, escribiendo solo procesos sencillos. Sin embargo, siempre hay una gran diferencia entre la teoría y la práctica.

Vamos a revisar la evolución de los lenguajes de programación de una forma muy popular. Los primeros lenguajes de programación, y todavía hoy en día algunos poco utilizados, no implementaban estructuras iterativas sino solo condicionales. Entonces, ¿cómo se repite una instrucción?

Simplemente llamando al subprograma que contiene esta instrucción en una condicional, hasta que la condición para detener la iteración establecida en la condición SI sea cierta.

Vamos a modelizar este principio en la visualización de una tabla.

Para mostrar una tabla, tenemos que recorrerla desde el primer elemento hasta el último. Así que tenemos que parar después de mostrar el último elemento. Por lo tanto, nuestra condición de parada es "hemos procesado el último elemento".

Una tabla se recorre utilizando un contador que se incrementa a medida que se recorre. Por lo tanto, podemos modelar nuestra condición de parada de la siguiente manera: el contador debe ser mayor que el tamaño de la tabla. Si he procesado el último elemento de la tabla, me detengo, es decir, el contador ha alcanzado el tamaño de la tabla.

Existen varios tipos de recursión: simple, múltiple, cruzada y anidada. En este capítulo, solo discutiremos los dos primeros tipos, dejando que el lector explore los dos últimos por su cuenta. Todos estos diferentes tipos de recursión se basan en el mismo principio que la recursión simple; solo cambia la jerarquía de las llamadas recursivas.

1. Recursividad simple

La recursividad simple es la más utilizada. Consiste en un subprograma que se llama a sí mismo para iterar un proceso.

Un subprograma recursivo siempre se escribe con una sentencia SI que determina la condición de parada y, en el caso de un SI, la llamada al subprograma:

SUB-PROGRAMA sub-prog-A   
VAR   
   ...  
INICIO   
   SI...

Algoritmos avanzados para tablas

El principal objetivo de la informática es simplificar procesos complejos para el usuario. Por ello, cuando un programa trabaja con tablas, introducidas o no por el usuario, debe ordenarlas para facilitar su manejo y, por tanto, su búsqueda.

Ahora que hemos estudiado las subrutinas y la recursividad, podemos ver cómo realizar estas operaciones de ordenación, empezando por los algoritmos más sencillos para el ser humano, es decir, los menos eficientes para la máquina, hasta llegar a los más optimizados para el ordenador y, por tanto, los menos sencillos para el cerebro humano (es decir, utilizando subrutinas recursivas).

1. Procedimiento de intercambio

Cuando ordenamos una tabla, seguramente tendremos que intercambiar valores con bastante frecuencia. Vamos a definir un procedimiento para realizar esta operación de forma que podamos reutilizarlo en los algoritmos de ordenación que veremos más adelante.

PROCEDIMIENTO intercambiar(E/S : x, y : ENTERO)   
VAR   
   tmp : ENTERO   
INICIO   
   tmp <- x   
   x <- y   
   y <- tmp   
FIN 

2. Ordenación por selección

La ordenación por selección es la ordenación con la lógica más simple. Empezamos buscando el valor más pequeño de la tabla y lo colocamos en la primera celda, desplazando las demás celdas como se muestra en la figura siguiente. Lo único que tenemos que hacer, es aplicar las mismas operaciones a la subtabla que empieza en la celda 2, luego a la que empieza en la celda 3, y así sucesivamente, hasta llegar a una subtabla final de tamaño 1, lo que indica que la tabla está correctamente ordenada.

images/cap6_pag31.png

Ordenación por selección

La clasificación por selección requiere, por tanto, dos operaciones:

  • Encontrar el valor más pequeño.

  • Intercambiar la celda actual con la primera celda de la subtabla correspondiente.

Así que necesitamos un subprograma para encontrar el valor más pequeño o, más bien, el índice del valor más pequeño de una tabla.

FUNCION indice_minimo (tab : TABLA[] : ENTERO, inicio,  
tamanio : ENTERO) : ENTERO   ...

Funciones y procedimientos con Python

Como señalamos en la sección anterior, Python solo implementa funciones.

1. Funciones en Python

Las funciones de Python se deben declarar al principio del script. El bloque de instrucciones es obligatorio para las funciones. Si, por razones prácticas, necesitamos dejar vacío el cuerpo de una función, utilizamos la palabra clave pass. Para definir una función, utilizamos la palabra clave def.

Una buena forma de separar las funciones del código principal, es utilizar una sentencia if especial en Python:

if __name__ == '__main__': 

# una función sin cuerpo 
def miFuncion():   
   pass   
   
# código para el procedimiento muestra_tabla   
def muestraTabla(tab):   
   for e in tab:   
      print(e)   
   
# código del procedimiento doble   
def doble(a):   
   return a * a   
   
# código de la función maximo   
def maximo(a,b):   
   if a > b :   
      return a   
   else:   
      return b   
   
# programa principal   
if __name__ == '__main__':   ...

Ejercicios

1. Ejercicio 1

Escriba un algoritmo que calcule el área de un círculo en una subrutina. Codifique el script Python correspondiente.

2. Ejercicio 2

Escriba un algoritmo que calcule el volumen de una caja en una subrutina. Codifique el script Python correspondiente utilizando valores por defecto para los argumentos de la función.

3. Ejercicio 3

Escriba un algoritmo que calcule y devuelva en un subprograma el valor mayor de una tabla, entre dos índices que se pasan como argumentos. Codifique el script Python correspondiente.

4. Ejercicio 4

Escriba un algoritmo con un subprograma que devuelva el nombre del mes según su número. Por ejemplo, si el usuario introduce 1, se mostrará enero. Codifique el script Python correspondiente.

5. Ejercicio 5

Escriba un algoritmo que calcule el número de palabras de una cadena utilizando una subrutina. Para simplificar, supondremos que dos palabras solo están separadas por un espacio. Codifique el script Python correspondiente.

6. Ejercicio 6

Escriba un algoritmo que dé el número de dígitos de un número entero introducido por el usuario. Codifique el script Python correspondiente.

7. Ejercicio 7

Escriba un algoritmo que determine si dos palabras son anagramas o no. Codifique el script Python correspondiente.

8. Ejercicio 8

Escriba un algoritmo que calcule en un subprograma la distancia de Hamming entre dos argumentos de tipo cadena...