Una posible solución sería hacer dos funciones: una que ordene los datos de manera ascendente y otra que los ordene de manera descendente, tal y como se muestra en el Ejemplo 7.10.
La función burbujaAscendente ordena los datos de forma ascendente, mientras que la función burbujaDescendente los ordena de forma descendente tal y como sus identificadores lo sugieren.
Compare las funciones y notará que son exactamente iguales excepto por las líneas 14 y 29 respectivamente, que es en donde se realiza la comparación de los elementos para determinar el orden en que están e intercambiarlos, si fuera necesario, en base al tipo de ordenamiento.
La solución presentada, aunque es útil y válida, no es una solución eficiente en espacio ni elegante. El lenguaje de programación C proporciona un mecanismo para abordar de mejor forma este tipo de situaciones: los apuntadores a funciones.
Un apuntador a función almacena la dirección en memoria del inicio de las instrucciones de una función, la cuál está representada por su identificador.
De manera informal puede decirse entonces, que un apuntador a función es un mecanismo que permite hacer referencia a una función de manera implícita.
Los apuntadores a funciones pueden asignarse, ser almacenados en arreglos, pasados a funciones, regresados por funciones, etcétera. El Ejemplo 7.11 muestra la forma de definir un apuntador a funciones en la función burbuja de las líneas 17-30.
La explicación de los ejemplos siguientes se centrará exclusivamente en el tema de la entrada: apuntadores a funciones, no en el ordenamiento por burbuja.
El tercer parámetro de la función burbuja (línea 17) indica que se recibirá un apuntador a funciones que tengan la siguiente estructura:
- Reciban dos argumentos de tipo int.
- Regresen un valor de tipo int.
Note que en la expresión:
Por otro lado, la expresión:
Observe ahora la línea 23 del Ejemplo 7.11, en la cual ocurre la des referencia del apuntador a función, es decir, en ella se invocará a la función cuyo identificador coincida con el tercer argumento enviado a la función burbuja en su invocación (líneas 16 y 19 del Ejemplo 7.12).
Ahora bien, el Ejemplo 7.12 muestra la forma de pasar el apuntador denotado por el identificador respectivo, a la función burbuja en las líneas 16 y 19. Note que en la línea 6 se está incluyendo la biblioteca de funciones del Ejemplo 7.11.
Observe que el apuntador a funciones orden hace que la línea 23 del Ejemplo 7.11 se transforme en un llamado explícito a las funciones ascedente o descedente; es decir, convierte la expresión:
en la expresión:
para el llamado a la función burbuja (línea 19) del Ejemplo 7.12.
es lógicamente equivalente a la estructura de selección if-else:
if(a > b)
return 1;
else
return 0;
Salida del Ejemplo 7.12. |