30 de septiembre de 2016

Abstracción de matrices.

   En la entrada correspondiente a Asignación Dinámica de Memoria se presentó, en el Ejemplo 7.7, una biblioteca de funciones para la creación y manipulación de matrices utilizando asignación dinámica de memoria. En esta entrada se retomarán las ideas presentadas en las secciones Asignación Dinámica de Memoria y Abstracción en Acción para subir el nivel de abstracción en la representación de matrices, y con ello poder crear y manipular matrices de números racionales.

   El Ejemplo 8.5 es esencialmente igual al Ejemplo 7.7; tómese el tiempo de compararlos línea a línea y función por función ya aquí sólo se remarcarán los aspectos más sobresalientes, dado que la creación de matrices no es el tema de la entrada.

   La clave de la abstracción ocurre en las líneas 7-11 del Ejemplo 8.5 con la definición de la estructura RACIONAL (líneas 7-9), y la re definición del tipo doble apuntador a RACIONAL por MATRIZ_RACIONAL (línea 11).

   La re definición del tipo doble apuntador a RACIONAL por el nuevo tipo de dato MATRIZ_RACIONAL hace que ahora las funciones, en lugar de recibir un doble apuntador a int (como en el Ejemplo 7.7), reciban una variable de tipo MATRIZ_RACIONAL lo cual hace, desde su lectura e interpretación, un enfoque mucho más conveniente para la programación reforzando, no sólo la naturaleza de los tipos de datos involucrados, sino también la auto documentación del código fuente.

   Observe cómo todos los tipos de datos han sido ajustados en correspondencia al nuevo enfoque de abstracción, tal y como se muestra en las líneas 13, 21, 22, 25, 28, 38, 51, 72 y 73.

   Por otro lado, los datos almacenados en la matriz son ahora del tipo RACIONAL, por lo que cada uno de ellos tiene dos elementos miembro: p y q, los cuales son considerados tanto en la lectura (línea 45), como en la salida de datos (línea 58).

   Por último, la función suma de las líneas 72-81 se apoya (línea 79) de la función sumaRacional de las líneas 63-70 para realizar la suma de dos números racionales, ya que la suma de racionales no es la suma tradicional de elemento a elemento, sino la suma representada por la expresión:

r1 + r2 = (p1 / q1) + (p2 / q2) = [ (p1 * q2) + (p2 * q1) ] / (q1 * q2)

donde r1 y r2 son dos números racionales (Q) definidos como:

r1 = p1 / q1 con p1, q1 números enteros (Z) y  q1 != 0
r2 = p2 / q2 con p2, q2 números enteros (Z) y  q2 != 0

   El Ejemplo 8.6 es análogo al Ejemplo 7.8; tómese también el tiempo para compararlos y comprender sus diferencias. Note cómo la abstracción definida en la biblioteca de funciones ejemplo8_5.h es utilizada en la línea 9 del Ejemplo 8.6, mostrando con ello que el uso apropiado de bibliotecas de funciones también refuerza la abstracción a través de la modularidad o programación modular.

   Finalmente, una posible salida para el Ejemplo 8.6 se muestra en la siguiente figura:

Una posible salida para el Ejemplo 8.6.