Documentos de Académico
Documentos de Profesional
Documentos de Cultura
13
192
13.2. Definici
on de un TDA
Para definir un TDA, llamado A partiendo de la definicion de producto cartesiano
A = A1 A2 A3 ... An La definicion de dicho TDA en C++ sera la siguiente:
struct
A_1
A_2
A_3
.
.
.
A_n
};
base_A{
a_1;
a_2;
a_3;
a_n;
typedef base_A* A;
La palabra struct declara la construccion de la estructura como el producto cartesiano
y typedef nos permite nombrar un puntero a la estructura base A y as poder manipular
el TDA como parametro en una funcion o retornarlo como salida de funciones sin realizar
cambios adicionales utilizando memoria dinamica.
Como ejemplo pueden definirse los numeros complejos C como un TDA constituido por
dos numeros reales, uno que representa la parte real del y otro que representa la parte
imaginaria. C = R R. En C++ se declararan as:
DE UN TDA
13.2. DEFINICION
193
struct base_complejo{
double x; //parte real
double y; //parte imaginaria
};
typedef base_complejo* complejo;
194
Una funcion analizadora para un numero complejo es la obtencion de la parte real del
numero:
1 C R
(x, y) z x
Para la parte imaginaria del n
umero:
2 C R
(x, y) z y
En C++:
195
196
En C++ se tiene:
complejo sumar_complejo(complejo z1, complejo z2){
return crear_complejo(z1->x + z2->x, z1->y + z2->y);
};
197
Para escribir un TDA, debe escribirse cada uno de los componentes de la estructura en
el flujo de datos y retornar el flujo de datos. Se puede definir esta funcion matematicamente aprovechando la composicion de funciones:
escribir A OS A OS
(os, a) z escribir An (escribir An1 (...(escribir A1 (os, a1 ), ...)an1 ), an )
En C++:
ostream& escribir_A(ostream& os, A a){
return escribir_An(...(escribir_A2(escribir_A_1(os, a_1),
a2),...), a_n);
};
Para la escritura de un n
umero complejo en un flujo se tiene:
escribir complejo OS C OS
(os, z) z (escribir real(escribir real(os, x), y)
En C++ (se agrega el codigo de escribir real por comodidad):
ostream& escribir_real(ostream& os, double x){
os << x << "\t";
};
ostream& escribir_complejo(ostream& os, complejo z){
return escribir_real(escribir_real(os, z->x), z->y);
};
Debe tenerse en cuenta que para mejorar la escritura del tipo de dato la funcion escribir
real que se definio en la parte de flujos de datos escribe un caracter tabulador al final de
cada dato. La declaracion de esta funcion equivale a:
ostream& escribir_complejo(ostream& os, complejo z){
return os << x << "\t" << y << "\t";
};
198
En general se tiene:
liberar A A
(a) z
En C++ se tiene:
199
int main(){
complejo z1 = leer_complejo(cin);
complejo z2 = leer_complejo(cin);
complejo z3 = sumar_complejo(z1, z2);
escribir_complejo(cout, z3);
liberar_complejo(z1);
liberar_complejo(z2);
liberar_complejo(z3);
system("pause");
return 0;
};
Dado el siguiente flujo de entrada de consola dado por un usuario correspondiente a la
suma de dos complejos (3, 4i) y (2, 5i), el programa retorna a la salida de consola la
suma de dos complejos (1, 1i) como se aprecia a continuacion:
-3
4
2
-5
-1
-1
Press any key to continue . . .
Debe observarse que toda estructura creada despues de utilizarse es liberada en el
programa principal.