En cada caso se debe implementar el TAD descripto y una aplicación que, utilizando el tipo abstracto de dato, permita al usuario el ingreso de una o más instancias (según sea necesario), la aplicación de cualquiera de las operaciones y luego la obtención del resultado.
Crear un TAD NumeroRacional
.
struct NumeroRacional {
int numerador;
int denominador;
};
El TAD debe disponer de las siguientes operaciones:
numerador
: Función que retorna el numerador del número racional pasado como parámetro.denominador
: Función que retorna el denominador del número racional pasado como parámetro.inicializar
: Función que guarda el numerador y denominador pasados como parámetro en la estructura NúmeroRacional indicada. La función debe retornar un valor booleano indicando si la inicialización fue correcta o no (por ejemplo, si el denominador es cero).simplificar
: Función que simplifica el número racional pasado como parámetro. La función debe modificar la estructura NúmeroRacional pasada como parámetro, de manera que el numerador y denominador queden simplificados. Por ejemplo, si el número racional es 4/8, la función lo debe modificar a 1/2. La función no debe retornar nada.sumar
: Función que retorna el número racional resultante de sumar los dos números racionales pasados como parámetro.restar
: Función que retorna el número racional resultante de restar los dos números racionales pasados como parámetro.multiplicar
: Función que retorna el número racional resultante de multiplicar los dos números racionales pasados como parámetro.dividir
: Función que retorna el número racional resultante de dividir los dos números racionales pasados como parámetro.comparar
: Función que retorna un valor dentro de los enumerados, dependiendo de si el número racional f1 es mayor, menor o igual al número racional f2.to_string
: Función que retorna un string con la representación del número racional pasado como parámetro.comparacion_to_string
: Función que retorne un string con la representación del enumerado de comparación pasado como parámetro.bool nr_inicializar(int numerador, int denominador, struct NumeroRacional *numeroRacional);
void nr_simplificar(struct NumeroRacional *numeroRacional);
struct NumeroRacional nr_sumar(struct NumeroRacional f1, struct NumeroRacional f2);
struct NumeroRacional nr_restar(struct NumeroRacional f1, struct NumeroRacional f2);
struct NumeroRacional nr_multiplicar(struct NumeroRacional f1, struct NumeroRacional f2);
struct NumeroRacional nr_dividir(struct NumeroRacional f1, struct NumeroRacional f2);
enum COMPARACION {
MAYOR, MENOR, IGUAL
};
enum COMPARACION nr_comparar(struct NumeroRacional f1, struct NumeroRacional f2);
char *comparacion_to_string(enum COMPARACION comparacion);
char *nr_to_string(struct NumeroRacional numeroRacional);
struct NRacional f1, f2, f3;
nr_inicializar(2, 3, &f1); // true
nr_inicializar(4, 5, &f2); // true
nr_inicializar(2, 0, &f3); // false
nr_inicializar(-4, 6, &f3); // true
nr_simplificar(f1); // {2/3}
nr_simplificar(f3); // {-2/3}
nr_sumar(f1, f2); // {22/15}
nr_restar(f1, f2); // {-2/15}
nr_multiplicar(f1, f2); // {8/15}
nr_dividir(f1, f2); // {5/6}
nr_dividir(f2, f3); // {-6/5}
nr_comparar(f1, f2); // MENOR
Realizar otra implementación del TAD NumeroRacional
, usando la estructura de un numero racional como una fracción mixta, pero que siga siendo compatible con el TAD anterior, de manera que la implementación utilizada sea transparente al usuario.
Fraccion Mixta: El número racional se compone como la suma de una parte entera y una fracción pura (aquella que el denominador es menor que el numerador).
34/15 es impropia y sería equivalente a la fracción mixta 2 4/15, donde 2 sería la parte entera
, 4 es el numerador
y 15 el denominador
.
-21/4 es impropia y sería equivalente a la fracción mixta -5 -1/4, donde -5 sería la parte entera
, -1 es el numerador
y 4 el denominador
.
struct NumeroRacional {
int parteEntera;
int numerador;
int denominador;
};
Crear un TAD Fecha, compuesta de día, mes y año.
struct Fecha {
// A definir por el desarrollador
};
El TAD debe disponer de las siguientes operaciones:
unsigned short fecha_dia(struct Fecha f);
unsigned short fecha_mes(struct Fecha f);
unsigned int fecha_anio(struct Fecha f);
bool fecha_inicilizar(unsigned short dia, unsigned short mes, unsigned int anio, struct Fecha f);
struct Fecha fecha_sumarDias(struct fecha f, int dias);
int fecha_distanciaEnDias(struct fecha f1, struct fecha f2);
enum COMPARAR_FECHA {
ANTERIOR, POSTERIOR, IGUAL
}
enum COMPARAR_FECHA fecha_comparar(struct fecha f1, struct fecha f2);
bool fecha_enBisiesto(struct fecha f);
char* fecha_nombreMes(struct fecha f);
struct Fecha f1, f2, f3;
fecha_inicializar(20,1,2023, f1); => True
fecha_dia(f1); => 20
fecha_mes(f1); => 1
fecha_anio(f1); => 2023
fecha_inicializar(30,1,2023, f2); => True
fecha_inicializar(30,2,2023, f3); => False
fecha_inicializar(29,2,2024, f3); => True
fecha_sumarDias(f1, 13) => {2,2,2023}
fecha_distanciaEnDias(f1,f2); => 10
fecha_comparar(f3, f2); => POSTERIOR
fecha_enBisiesto(f1); => False
fecha_enBisiesto(f3); => True
fecha_nombreMes(f1); => "Enero"
Crear un TAD Fecha, donde todos los cálculos se realicen utilizando días julianos, pero que siga siendo compatible con el TAD anterior, de manera que la implementación utilizada sea transparente al usuario.
Crear un TAD CajaRegistradora
que tiene contenedores, uno para cada moneda y billete en circulación legal.
struct Contenedor {
float denominacion;
unsigned int cantidad;
};
struct CajaRegistradora {
struct Contenedor contenedores[];
};
El TAD debe disponer de las siguientes operaciones:
Cargar
: lo cual incrementa un contenedor con la cantidad de billetes indicada.DarVuelto
: dada una cantidad a cobrar y los billetes con los que se realizó el pago, devuelve el número de billetes de cada tipo que se debe retornar al cliente, utilizando los billetes de mayor valor siempre que haya disponibles e incrementando la cantidad de billetes que ingresaron por el pago y decrementando los dados de vuelto.Saldo
: devuelve el saldo total del cajero.CerrarCaja
: retorna un string con el detalle de los billetes y monedas que quedaron al final del turno en la caja registradora.struct CajaRegistradora cr_inicializar();
struct Contenedor contenedor_inicializar(float denominacion, unsigned int cantidad);
void cr_cargar(Contenedor cont, CajaRegistradora caja);
struct CajaRegistradora cr_darVuelto(float cantidadACobrar, struct CajaRegistradora billetesDados, struct CajaRegistradora cajaActual);
double cr_saldo(struct CajaRegistradora caja);
char* cr_cerrarCaja(struct CajaRegistradora caja);