guia-tp

Práctica 1: Introducción a los TAD

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.

Ejercicio 1

Crear un TAD NumeroRacional.

    struct NumeroRacional {
        int numerador;
        int denominador;
    };

El TAD debe disponer de las siguientes operaciones:

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);

Casos de testeo


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

Ejercicio 1 bis. Pensemos distinto

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.

    struct NumeroRacional {
        int parteEntera;
        int numerador;
        int denominador;
    };

Ejercicio 2

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);

Casos de testeo

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"

Pensemos distinto

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.

Ejercicio 3

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:

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);