Práctica Sem 5

Anuncio
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.
Descargar