Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Hasta ahora se ha trabajado con tipos de datos primitivos y arreglos. Los Tipos de
Datos Abstractos (TDA) nos permiten realizar una mayor abstracción de las cosas que
existen en el mundo real, pues nos permiten olvidar detalles sobre implementaciones y
mantener la esencia.
Cuando se tiene un tipo de dato primitivo como los enteros, se tiene la definición
de entero Z, que representa datos de tipo entero. En los enteros, se tienen definidas las
operaciones aritméticas +, ∗, −, /, mod que nos permiten realizar operaciones con este tipo
de datos sin conocer como se esta realizando una suma o una división a nivel de máquina.
En este libro se definieron funciones de lectura y escritura a flujos de datos para enteros.
Una vez definida la función si otra persona desea utilizarla lo unico que debe hacer es llamar
a la función e ignorar los detalles implementacion de la función en si.
struct base_A{
A_1 a_1;
A_2 a_2;
A_3 a_3;
.
.
.
A_n a_n;
};
typedef base_A* A;
struct base_complejo{
double x; //parte real
double y; //parte imaginaria
};
crear A ∶ A1 × A2 × A3 × ... × An Ð→ A
(a1 , a2 , a3 , ..., an ) z→ (a1 , a2 , a3 , ..., an )
En C++:
crear complejo ∶ R × R Ð→ C
(x, y) z→ (x, y)
En C++:
πi ∶ A Ð→ Ai
(a1 , a2 , a3 , ..., an ) z→ ai
En C++:
Una función analizadora para un numero complejo es la obtención de la parte real del
numero:
π1 ∶ C Ð→ R
(x, y) z→ x
π2 ∶ C Ð→ R
(x, y) z→ y
En C++:
Están asociadas a las asignaciones de un tipo de dato que hace parte de la estructura
del TDA y su función es inyectar un dato en la estructura reemplazando el valor de un
determinado tipo de dato.
Para el TDA complejo se tienen dos inyecciones, uno para la parte real:
i1 ∶ C × R Ð→ C
((x, y), r) z→ (r, y)
En C++:
En C++ se tiene:
leer A ∶ IS Ð→ A
(is) z→ (leer A1 (is), leer A2 (is), leer A3 (is), ..., leer An (is))
En C++:
A leer_A(istream& is){
return crear_A(leer_A1(is), leer_A2(is),
leer_A3(is), ..., leer_An(is));
};
leer complejo ∶ IS Ð→ C
(is) z→ (leer real(is), leer real(is))
En C++ se tiene:
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 función matemática-
mente aprovechando la composición de funciones:
escribir A ∶ OS × A Ð→ OS
(os, a) z→ escribir An (escribir An−1 (...(escribir A1 (os, a1 ), ...)an−1 ), an )
En C++:
escribir complejo ∶ OS × C Ð→ OS
(os, z) z→ (escribir real(escribir real(os, x), y)
Debe tenerse en cuenta que para mejorar la escritura del tipo de dato la función escribir
real que se definió en la parte de flujos de datos escribe un caracter tabulador al final de
cada dato. La declaración de esta función equivale a:
En general se tiene:
liberar A ∶ A Ð→ ∅
(a) z→
En C++ se tiene:
Como el tipo real (double) es primitivo, lo unico que se debe liberar es la estructura.
En C++ se tiene:
Tomando la definición de TDA de complejo un sencillo programa que lee dos complejos
de la entrada estandar de consola cin e imprime en la salida estándar cout es:
13.6. PROGRAMA PRINCIPAL 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;
};
-3 4
2 -5
-1 -1
Press any key to continue . . .