CI2126 Práctica 4 (Semana 5) Se han definido, en “triplets.h” (modificado) los siguientes macros del preprocesador para aligerar un poco la creación y destrucción dinámica de estructuras. #define new(POINTER) (POINTER = malloc(sizeof(*POINTER))) #define delete(POINTER) (free(POINTER), POINTER = NULL) Se usan para sustituir los siguientes casos: typedef int* int_ptr; int_ptr p; typedef int* int_ptr; int_ptr p; p = malloc(sizeof(int)); *p = 100; free(p); p = NULL; new(p); *p = 100; delete(p) La columna de la derecha representa lo mismo, pero es más legible. 1) Implementar el TAD Racional, usando estructuras dinámicas. Se suministran los encabezados (.h). Usted implementará el “.c” correspondiente, y usará el programa principal (main.c) para cada ejemplo. Los encabezados y programas principales para cada ejemplo están en la página web. TAD Racional (racional.h) /* Un tipo de dato para el par ordenado (num,den) * * que representa el Racional num/den */ typedef struct { int num; int den; } RacionalStruct_t; /* El apuntador a la anterior */ typedef RacionalStruct_t* Racional_t; /* Constructores */ Racional_t construirRacional (int n, int d); /* PRE: d != 0 POST: R_Crear devuelve un Racional_t con numerador x y denominador y */ void destruirRacional (Racional_t r); /* PRE: el Racional_t R ha sido creado POST: Libera el espacio ocupado por el Racional_t */ Racional_t clonarRacional (Racional_t r); /* PRE: r creado y r­>den != 0 POST: devuelve un Racional_t con numerador x y denominador y */ Racional_t sumarRacional (Racional_t x, Racional_t y); /* PRE: los Racional_t x e y han sido creados POST: Devuelve la suma */ Racional_t reciprocoRacional (Racional_t p); /* PRE: p­>num != 0 POST: R_Crear devuelve un Racional_t con numerador x y denominador y */ Racional_t multiplicarRacional (Racional_t x, Racional_t y); /* PRE: los Racional_t x, y han sido creados POST: Devuelve el producto */ Racional_t simplificarRacional (Racional_t r); /* PRE: el Racional_t R existe POST: Devuelve el producto */ /* Mutadores */ void fijarNum (Racional_t r, int n); /* PRE: el Racional_t R ha sido creado POST: Devuelve el Racional_t modificado con n como su numerador */ void fijarDen (Racional_t r, int d); /* PRE: el Racional_t R ha sido creado y d != 0 POST: Devuelve el Racional_t modificado con d como su denominador */ char* stringRacional(Racional_t r); /* PRE: el Racional_t R ha sido creado POST: Devuelve el string del racional */ /* Selectores */ int obtenerNum (Racional_t r); /* PRE: el Racional_t R ha sido creado POST: Devuelve el numerador del Racional_t */ int obtenerDen (Racional_t r); /* PRE: el Racional_t R ha sido creado POST: Devuelve el denominador del Racional_t */ char * imprimirRacional(Racional_t r); /* PRE: el Racional_t R ha sido creado POST: imprime el Racional_t R */ int mcd (int a, int b); /* Maximo Comun Divisor */ 2) Haga lo mismo para el TAD Complejo, que es bastante similar. /* Un tipo de dato para el par ordenado (num,den) * que representa el Complejo num/den */ typedef struct { float preal; float pimag; } ComplejoStruct_t; /* El apuntador a la anterior */ typedef ComplejoStruct_t* Complejo_t; /* Constructores */ Complejo_t construirComplejo (float n, float d); /* PRE: POST: R_Crear devuelve un Complejo_t con parte real x y parte imag y */ void destruirComplejo (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: Libera el espacio ocupado por el Complejo_t */ Complejo_t clonarComplejo (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: R_Crear devuelve un Complejo_t con numerador x y denominador y */ Complejo_t sumarComplejo (Complejo_t x, Complejo_t y); /* PRE: los Complejo_t x, y han sido creados POST: Devuelve la suma */ Complejo_t multiplicarComplejo (Complejo_t x, Complejo_t y); /* PRE: los Complejo_t x, y han sido creados POST: Devuelve el producto */ Complejo_t conjugadoComplejo (Complejo_t p); /* PRE: el Complejo_t R ha sido creado POST: R_Crear devuelve un Complejo_t con parte real x y parte imaginaria y */ /* Mutadores */ void fijarReal (Complejo_t r, float x); /* PRE: el Complejo_t R ha sido creado POST: Devuelve el Complejo_t modificado con n como su parte real */ void fijarImag (Complejo_t r, float y); /* PRE: el Complejo_t R ha sido creado POST: Devuelve el Complejo_t modificado con d como su parte imaginaria */ /* Selectores */ float obtenerReal (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: Devuelve el numerador del Complejo_t */ float obtenerImag (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: Devuelve el denominador del Complejo_t */ char * imprimirComplejo(Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: imprime el Complejo_t R */ float moduloComplejo (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: R_Crear devuelve el modulo */ float radioComplejo (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: R_Crear devuelve el radio */ float anguloComplejo (Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: R_Crear devuelve el angulo */ char* stringComplejo(Complejo_t r); /* PRE: el Complejo_t R ha sido creado POST: Devuelve el string del Complejo */ 3) Modifique el TAD Racional para que simplifique una fracción, es decir, hallar el Máximo Común Divisor tanto del numerador como del denominador, y si es mayor a 1, dividir ambos por esa cantidad.