Title: TDAs II
1TDAs (II)
- Clase 23
- Introducción a la Programación
- Marcos Sepúlveda(marcos_at_ing.puc.cl)
2Resumen de la última clase
- Los Tipos de Datos Abstractos (TDA) sirven para
simplificar el diseño y la implementación de los
programas. - Hemos visto que permiten
- Crear nuevos tipos de datos
- Crear funciones que operan sobre esos tipos de
datos - Creación y uso de nuevos tipos de datos
- typedef struct
- char nombre30
- char NumAlumno8
- float Nota1
- float Nota2
- float Nota3
- float NotaFinal
- Alumno
- Declaración de variables
- Alumno A1, A2, A3
- Alumno A100
- Declaración e inicializacion de variable
- Alumno A1 "Elvira", "98231465", 6.0, 5.5,
5.0, 5.5 - Asignación de variables
- strcpy(A1.Nombre, "Elvira")
- A0.Nota1 6.2
- Función que recibe como argumento una estructura
- void CalculaNota(Alumno A1)
- Función que retorna una estructura
- Alumno NuevoAlumno(char Nombre)
3Ejemplo implementación de operaciones con
números racionales
- Tipo de datos
- typedef struct int num int den
Racional - Interfaz de la funciones a implementar
- Racional NuevoRacional(int n, int d) /
Constructor / - int Numerador(Racional x) / Retorna el
numerador de x / - int Denominador(Racional x) / Retorna el
denominador de x / - Racional Sumar(Racional x, Racional y) /
Retorna xy / - Racional Restar(Racional x, Racional y) /
Retorna x-y / - Racional Multiplicar(Racional x, Racional y) /
Retorna xy / - Racional Dividir(Racional x, Racional y) /
Retorna x/y / - int SonIguales(Racional x, Racional y) /
TRUE si xy / - void Imprimir(Racional x) / Imprime x en
la pantalla /
4Beneficios de los TDAs
- Si tenemos que saber siempre cómo están
implementados los tipos de datos, nuestros
programas dependerán de esa implementación. - Esto quiere decir que si se producen cambios en
la implementación del tipo de datos, será
necesario cambiar el programa para que siga
funcionando. - Los TDAs permiten olvidarse (abstraerse) de los
detalles - Y si no sabemos cómo están implementados los
tipos de datos, cómo los podemos usar? - Mediante una interfaz, predefinida e invariante.
Interfaz
Datos
5Características de los TDAs
- Los datos que componen el TDA se mantendrán
ocultos de los programadores que lo usan. - La única forma de accederlos es a través de la
interfaz. - La interfaz está compuesta por funciones,
llamadas constructores y selectores. - Los constructores son los encargados de
inicializar las nuevas instancias del TDA. - Los selectores suministran la funcionalidad que
le da productividad al TDA. - Permite extraer, agregar, modificar, o eliminar
datos a partir de una instancia del TDA.
6EjemploManajedor de Cassettes y CDs
- Menú con la funcionalidad deseada
- Ingresar cassette
- Ingresar CD
- Eliminar cassette
- Eliminar CD
- Listar cassettes
- Listar CDs
- Listar todo
- Buscar por titulo
- Buscar por interprete
- Salir
7Manejador de CDs y cassettes (2)Definición TDA
Registro
- Cada registro almacenará los datos de una
grabación. La interfaz del TDA Registro está
compuesta por las siguientes funciones - CrearRegistro
- Parámetros titulo (string) e inteprete (string)
- Valor de retorno R (Registro)
- Descripción Se crea un registro con el título e
intérprete suministrados. - TituloRegistro
- Parámetros R (Registro)Valor de retorno
titulo (string) Descripción Retorna el título
almacenado en un registro. - InterpreteRegistro
- Parámetros R (Registro)Valor de retorno
interprete (string) Descripción Retorna el
interprete almacenado en un registro. - RegistroVacio
- Parámetros R (Registro)Valor de retorno 1 si
el registro está vacio, 0 en caso contrario
Descripción Indica si el registro está vacio. - ImprimirRegistro
- Parámetros R (Registro)Valor de retorno no
tiene Descripción Despliega en pantalla el
título de la grabación y el intérprete encerrado
entre paréntesis.
8Manejador de CDs y cassettes (3)Definición TDA
Lista
- Los elementos de la lista tienen asociado un
identificador único de tipo Id. La constante FIN,
también de tipo Id, se emplea para ciertos
propósitos. La interfaz del TDA Lista está
compuesta por las siguientes funciones - CrearLista
- Parámetros No tiene
- Valor de retorno L (Lista)
- Descripción Se crea la lista vacía L
- Insertar
- Parámetros L (Lista), R (Registro)Valor de
retorno L (Lista) modificada - Descripción Agrega un nuevo registro R a la
lista L. - Primero
- Parámetros L (Lista) Valor de retorno
Identificador de elemento (Id)Descripción
Retorna el identificador del primer elemento de
la lista L, o la constante FIN en caso que la
lista esté vacía. - Siguiente Parámetros L (Lista), id
(identificador) Valor de retorno Identificador
de elemento (Id) Descripción Retorna el
identificador del siguiente elemento en la lista
L, a partir del elemento id, o la constante FIN
en caso que ya no existan más elementos.
9Manejador de CDs y cassettes (4)Definición TDA
Lista
- Imprimir Parámetros L (Lista), id
(identificador)Valor de retorno No tiene
Descripción Despliega en la pantalla el
elemento de L cuyo identificador fue suministrado
(id). - BuscarT Parámetros L (Lista), id (Id), titulo
(string) Valor de retorno Identificador de
elemento (Id) Descripción Busca el primer
elemento de la lista L cuyo titulo sea igual al
parámetro suministrado y retorna su
identificador, o la constante FIN si no se
encuentra. La búsqueda empezará a partir del
elemento cuyo identificador se pasó como
parámetro (id). - BuscarI Parámetros L (Lista), id (Id),
intérprete (string) Valor de retorno
Identificador de elemento (Id) Descripción
Busca el primer elemento de la lista L cuyo
intérprete sea igual al parámetro suministrado y
retorna su identificador, o la constante FIN si
no se encuentra. La búsqueda empezará a partir
del elemento cuyo identificador se pasó como
parámetro (id). - Borrar Parámetros L (Lista), id (Id) Valor de
retorno L (Lista) modificadaDescripción Borra
de la lista L el elemento cuyo identificador se
pasó como parámetro (id).
10Manejador de CDs y cassettes (5)Declaración de
estructuras de datos
- Especificación del algoritmo
- 1. Crear lista LKCT
- 2. Crear lista LCD
- 3. Iterar hasta que el usuario seleccione salir
- 3.1. Desplegar menú y pedir opción al usuario
- 3.2. Dependiendo de la opción seleccionada,
ejecutar una cierta acción
11Manejador de CDs y cassettes (6)Declaración de
estructuras de datos
- a. Opción Ingresar cassette
- 1. Pedir al usuario TITULO e INTERPRETE
- 2. reg Crear Registro(TITULO, INTERPRETE)
- 3. LKCT Insertar(LKCT, reg)
- b. Opción Ingresar CD
- 1. Pedir al usuario TITULO e INTERPRETE
- 2. reg Crear Registro(TITULO, INTERPRETE)
- 3. LCD Insertar(LCD, reg)
- c. Opción Eliminar cassette
- 1. Pedir al usuario TITULO que desea borrar
- 2. regId BuscarT(LKCT, Primero(LKCT), TITULO)
- 3. Si regId es distinto de FIN
- LKCT Borrar(LKCT, regId)
- 4. Si por el contrario regId es igual a FIN
- Desplegar mensaje de error pues el título no se
encontró - d. Opción Eliminar CD
12Manejador de CDs y cassettes (7)Declaración de
estructuras de datos
- e. Opción Listar cassettes
- 1. regId Primero(LKCT)
- 2. Itere mientras regId sea distinto de FIN
- 2.1. Imprimir(LKCT, regId)
- 2.2. regId Siguiente(LKCT, regId)
- f. Opción Listar CDs
- 1. regId Primero(LCD)
- 2. Itere mientras regId sea distinto de FIN
- 2.1. Imprimir(LCD, regId) 2.2. regId
Siguiente(LCD, regId) - g. Opción Listar todo
- 1. regId Primero(LKCT)
- 2. Itere mientras regId sea distinto de FIN
- 2.1. Imprimir(LKCT, regId) 2.2. regId
Siguiente(LKCT, regId) - 3. regId Primero(LCD)
- 4. Itere mientras regId sea distinto de FIN
- 4.1. Imprimir(LCD, regId) 4.2. regId
Siguiente(LCD, regId)
13Manejador de CDs y cassettes (8)Declaración de
estructuras de datos
- h. Opción Buscar por titulo
- 1. Pedir al usuario TITULO a buscar
- 2. regId BuscarT(LKCT, Primero(LKCT), TITULO)
- 3. Si regId es distinto de FIN
- 3.1. Imprimir(LKCT, regId)
- 4. Si por el contrario, regId es igual a FIN
- 4.1. regId BuscarT(LCD, Primero(LCD), TITULO)
4.2. Si regId es distinto de FIN - 4.2.1 Imprimir(LCD, regId)
- 4.3. Si por el contrario, regId es igual a FIN
- 4.3.1. Desplegar mensaje no se encontró el
título
14Manejador de CDs y cassettes (9)Declaración de
estructuras de datos
- typedef struct
- char tituloLARGO_STR
- char interpreteLARGO_STR
- Registro
- typedef struct
- Registro ListaMAX_LISTA
- Lista
15Ejemplo paso por valor
- Racional PreguntarNuevosValores(Racional x)
- int num, den
- printf("Ingrese primer numero racional\n")
- printf("Numerador ")
- scanf("d", num)
- printf("Denominador ")
- scanf("d", den)
- x.num num
- x.den den
- return x
-
- void PreguntarNuevosValoresMalo(Racional x)
- int num, den
16Ejemplo paso por valor
- main()
- int num, den
- Racional r1, r2
- printf("Ingrese primer numero racional\n")
- printf("Numerador ")
- scanf("d", num)
- printf("Denominador ")
- scanf("d", den)
- r1 NuevoRacional(num,den)
- printf("Ingrese segundo numero racional\n")
- printf("Numerador ")
- scanf("d", num)
- printf("Denominador ")
- scanf("d", den)
- r2 NuevoRacional(num,den)
- printf("Numeros racionales ingresados ")
17Ejemplo paso por valor
- printf("Multiplicacion es ")
- Imprimir(Multiplicar(r1,r2))
- printf("\n")
- printf("Division es ")
- Imprimir(Dividir(r1,r2))
- printf("\n")
- printf("Son iguales ? ")
- if (SonIguales(r1,r2))
- printf("si\n")
- else
- printf("no\n")
- printf("Cambiar el valor de un racional\n")
- printf("- Valor del racional antes de
cambiarlo ") - Imprimir(r1)
- printf("\n")