Tipo de Dato Abstracto (Ejercicios)
Dupla
Codificar el TDA para representar una "dupla". Una dupla es un conjunto ordenado de tamaño fijo de 2 elementos. Para acotar la implementación podrían realizar una Dupla de dos enteros (int), a fin de simplificarlo. Con lo cual no sería una Dupla genérica que podrá tener cualquier tipo de elemento.
Las operaciones definidas sobre la dupla deberán ser:
- crear(int primero, int segundo) -> Dupla
- primero(Dupla) -> int
- segundo(Dupla) -> int
- multiplicar(Dupla d, int multiplo) -> Dupla : Genera una nueva Dupla que es el resultado de multiplicar ambos elementos por el número multiplo que se pasa por parámetro.
- adicionar(Dupla dupla, int adicion) -> Dupla: genera una nueva Dupla resultado de sumarle el numero dado a ambos elementos.
- sumar(Dupla a, Dupla b) -> Dupla: genera una nueva dupla resultado de la suma de las dos.
- restar(Dupla a, Dupla b) -> Dupla: idem anterior, pero restando de a, los valores de la dupla b
- etc... (pueden acá definir más operaciones que les parezca).
Nota:
Estas definición de las operaciones, definen al tipo de dato Dupla como inmutable, es decir, cuando invocamos la función multiplicar, por ejemplo, no va a alterar la dupla original que pasamos por parámetro, si no que va a devolver una nueva. La original nunca se modifica. Ésto es una decisión, no es necesario. Podríamos haber definido operaciones que modifican la Dupla, en cuyo caso no haría falta que devuelvan nada. Eso va a "gusto" de ustedes. Hasta podrían ejercitar hacer ambas cosas.
String / Texto
Realizar un TDA que represente la idea de “texto”. Como ya sabemos en C no existe este tipo básico, con lo cual nuestras aplicaciones siempre quedan acopladas a la idea de que un string es una cadena de caracteres, por lo que se manejan con punteros y posiciones.
A continuación una definición básica del TDA (pueden ustedes definir más operaciones si quisieran).
tipo abstracto Texto
operacion crear(char* c) -> Texto
operacion destruir(Texto t)
operacion tamanio(Texto t) -> int
operacion caracterEn(Texto texto, int posicion) -> char
operacion concatenar(Texto t1, Texto t2)
// Ej: reemplazar('Balsa', 'a', 'o') >> 'Bolso'
operacion reemplazar(Texto texto, char caracter, char nuevoCaracter)
// Ej: porcion('Bienaventurados', 4, 7) -> 'ave'
operacion porcion(Texto texto, int desde, int hasta) -> Texto
// indica si el 'texto' comienza con el contenido de 'prefijo'.
// Ej: comienzaCon('Hola Mundo', 'Hola') -> true
// comienzaCon('Hola Mundo', 'Chau') -> false
// comienzaCon('Hola Mundo', 'Ho') -> true
operacion comienzaCon(Texto texto, Texto prefijo) -> boolean
// indica si el texto finaliza con el sufijo dado
operacion terminaCon(Texto texto, Texto sufijo) -> boolean
Boolean
Realizar un TDA para el tipo booleano en C. Recordar que en C no existe este tipo como tipo básico, por lo cual muchas veces nuestro código pierde legibilidad y a veces el uso de números lleva a errores. En C se asume que el número 1 es verdadero y el 0 es falso.
Describimos el TDA como:
tipo abstracto boolean
operacion create(int condicionComoInt) -> boolean
operacion and(boolean b1, boolean b2) -> boolean
operacion or(boolean b1, boolean b2) -> boolean
operacion not(boolean b1) -> boolean
operacion comoInt(boolean b) -> int
Pueden agregar más operaciones
Fecha
Realizar un TDA Fecha, abstracción de las fechas, que consisten en un año, un mes y un día y permiten abstraer de la representación interna y operar fechas:
tipo abstracto Fecha
operacion crearDesdeTextoAnioDosDigitos(char[6] fechaEnTexto) -> Fecha
operacion crearDesdeTextoAnioCompleto(char[8] fechaEnTexto) -> Fecha
operacion crear(int dia, int mes, int anio) -> Fecha
// devuelven los componentes de la fecha como números
operacion dia(Fecha f) -> int
operacion mes(Fecha f) -> int
operacion anio(Fecha f) -> int
operacion sumarDias(Fecha f, int dias)
operacion sumarMeses(Fecha f, int meses)
operacion sumarAnios(Fecha f, int anios)
// operaciones sobre la fecha, utilizando el TDA Período (representa una período de tiempo y no un instante en el tiempo, lo cual es una fecha)
operacion sumar(Fecha f, Periodo p)
Para eso definimos un TDA adicional Período (puede ester en el mismo archivo y todo)
tipo abstracto Periodo
// Crea un periodo especificado todo el períod en días. Ej: trabajé en la empresa 66 días
operacion crear(int dias) -> Periodo
// Crea un periodo especificado en meses + dias. Ej: trabajé en la empresa 2 meses y 6 días
operacion crear(int meses, int dias) -> Periodo
// Crea un periodo especificado en anios + meses + dias. Ej: trabajé en la empresa 2 años, 3 meses y 7 días
operacion crear(int anios, int meses, dias) -> Periodo
// Retorno la representacion del Periodo en dias: Ej: 2 meses y 3 dias -> 63 dias
operacion traducirADias(Periodo p) -> int
// Estas funciones devuelven las componentes del periodo. Ej Periodo(3 años, 2 meses, 23 dias) -> 3 anios
operacion anios(Periodo p) -> int
// Ej Periodo(3 años, 2 meses, 23 dias) -> 2 meses
operacion meses(Periodo p) -> int
// Ej Periodo(3 años, 2 meses, 23 dias) -> 23 dias
operacion dias(Periodo p) -> int
// Compara el primer periodo contra el segudo. Retorna: 1 si p1 > p2, 0 si p1 = p2, -1 si p1 < p2
operacion comparar(Periodo p1, Periodo p2) -> int
Fracciones
Realizar un TDA para números fraccionarios, es decir aquellos que se expresan como el cociente de dos números enteros.
Las operaciones que deberá soportar el TDA son:
tipo abstracto Fraccion
operacion crear(int numerador, int denominador) -> Fraccion
operacion numerador (Fraccion f) -> int
operacion denominador (Fraccion f) -> int
operacion sumar (Fraccion f1, Fraccion f2) -> Fraccion
operacion restar (Fraccion f1, Fraccion f2) -> Fraccion
operacion multiplicar (Fraccion f1, Fraccion f2) -> Fraccion
operacion dividir (Fraccion f1, Fraccion f2) -> Fraccion
operacion iguales (Fraccion f1, Fraccion f2) -> boolean
operacion simplificar (Fraccion f) -> Fraccion