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