La implementación consiste en tomar el diseño del TDA y convertirlo en algo
real, en nuestro caso es llevarlo a un lenguaje de computador. La implementación
de un TDA no es única; dado un diseño de un TDA es posible implementarlo de muy
diversas formas, como se expresa en la figura .
Cada implementación puede ser distinta o por los tipos de datos que se utilizan o por los constructores de datos. Esto último se refiere por ejemplo a usar estructuras o clases para construir el TDA. Lo importante aqui, es que, aunque hay varias implementaciones estas representan el mismo TDA. Esto es tan cierto que debe llegarse al caso esquematizado en la figura
Ahora vamos a reafirmar estos conceptos con el ejemplo, el TDA Complejo que hemos venido trabajando y haremos varias implementaciones de éste, para poder determinar las bondades de cada una y su impacto en un código que utiliza el TDA.
La primera implementación que vamoa a hacer del TDA Complejo consiste en usar
un arreglo de dos flotantes, como se ve en la figura ; el de la posición cero se guarda la parte real y en la posición
uno la parte imaginaria. Las operaciones se podrián implementar como funciones.
Esta implementación se puede ver en el código siguiente:
/*
Autor: "L. Alejandro Bernal R."<lbernal@uvirtual.ean.edu.co>
Descripción: Implementacion del TDA Complejo como un arreglo de flotantes.
*/
#include <stdio.h>
/*
Descripción: Suma dos números complejos.
*/
void sumar(float c1[], float c2[], float respuesta[])
{
/* Sumar. */
respuesta[0] = c1[0] + c2[0];
respuesta[1] = c1[1] + c2[1];
} /* sumar */
int main(void)
{
float a[2], b[2], resp[2];
a[0] = 1.0; a[1] = 2.1;
b[0] = 2.0; b[1] = 3.4;
sumar(a,b, resp);
printf("(%f,%f) + (%f,%f) = (%f,%f)\n", a[0], a[1], b[0], b[1], resp[0], resp[1]);
return 0;
}
complejo.c
Autor: "L. Alejandro Bernal R."<lbernal@uvirtual.ean.edu.co>
Descripción: Implementacion del TDA Complejo como un arreglo de flotantes.
*/
#include <stdio.h>
typedef float Complejo[2]; /* Implementacion como arreglo. */
#define REAL 0
#define IMAG 2
/*
Descripción: Suma dos números complejos.
*/
void sumar(Complejo c1, Complejo c2, Complejo respuesta)
{
/* Sumar. */
respuesta[REAL] = c1[REAL] + c2[REAL];
respuesta[IMAG] = c1[IMAG] + c2[IMAG];
} /* sumar */
int main()
{
Complejo a, b, resp;
a[REAL] = 1.0; a[IMAG] = 2.1;
b[REAL] = 2.0; b[IMAG] = 3.4;
sumar(a,b, resp);
printf("(%f,%f) + (%f,%f) = (%f,%f)\n",
a[REAL], a[IMAG],
b[REAL], b[IMAG],
resp[REAL], resp[IMAG]);
return 0;
}
Las cosas deben llamarse por su nombre.
Se debe hacer lo que sea más natural.Lo primero es fácil de entender en especial cuando se piensa que un TDA es un modelo de la realidad, entonces debe haber una correspondencia uno a uno entre la realidad que se está representando y los TDAs. ¿Pero, qué es lo más natural?. Se habla de natural cuando no sólo hay una correspondencia de términos entre la realidad y el TDA (una correspondencia léxica), sino además, cuando hay una correspondencia a niveles sintáctico, semántico y pragmático. Esto es, una correpondencia a nivel de términos, a nivel de como se estructuran y relacionan estos términos y una correpondencia con quienes interpretan y manejan esta realidad.
Pero esta última representación todavia tiene sus problemas, todavía es posible aplicar la función sumar a arreglos de flotantes que no tengan nada que ver con números complejos.
Otra implementación posible del TDA Complejo sería mediante una estructura , como podemos ver en el siguiente código:
complejo2.c
Autor: "L. Alejandro Bernal R."<lbernal@uvirtual.ean.edu.co>
Descripción: Implementacion del TDA Complejo como un struct.
*/
#include <stdio.h>
typedef struct {
float real; /* Parte real del complejo. */
float imag; /* parte imaginaria deñl complejo. */
} Complejo;
/*
Descripción: Suma dos números complejos.
*/
void sumar(Complejo *c1, Complejo *c2, Complejo *respuesta)
{
/* Sumar. */
respuesta->real = c1->real + c2->real;
respuesta->imag = c1->imag + c2->imag;
} /* sumar */
int main()
{
Complejo a, b, resp;
a.real = 1.0; a.imag = 2.1;
b.real = 2.0; b.imag = 3.4;
sumar(&a, &b, &resp);
printf("(%f,%f) + (%f,%f) = (%f,%f)\n",
a.real, a.imag,
b.real, b.imag,
resp.real, resp.imag);
return 0;
}
complejo3.cpp
Autor: "L. Alejandro Bernal R."<lbernal@uvirtual.ean.edu.co>
Descripción: Implementacion del TDA Complejo como una clase.
*/
#include <stdio.h>
class Complejo {
private:
// Atributos:
float real; /* Parte real del complejo. */
float imag; /* parte imaginaria deñl complejo. */
public:
// Operaciones:
/*
Descripción: Construye un complejo.
*/
Complejo(float r, float i)
{
real = r;
imag = i;
} // Complejo
/*
Descripción: Suma dos números complejos.
*/
Complejo sumar(Complejo c2)
{
return Complejo(real + c2.real, imag + c2.imag);
} /* sumar */
/*
Descripción: Imprime un complejo en salida estandar.
*/
void imprimir()
{
printf("(%f,%f)", real, imag);
} // impr
}; // class Complejo
int main()
{
Complejo a(1.0, 2.1), b(2.0, 3.4);
a.imprimir(); printf(" + "); b.imprimir(); printf(" = ");
a.sumar(b).imprimir();
printf("\n");
return 0;
}
La mejor forma de implementación de TDAs son las clases.Por ello en este libro se seguirá implementando los TDAs utilizando esta forma. A continuación veremos como se usa un TDA.