tipos abstractos de datos en c
martes, 02 de octubre del 2007 a las 22:39
vamos a empezar con un tipo abstracto de datos muy sencillo, vamos a definir un numero fraccionario
1º para ello debemos comenzar con un fichero de extencion .h en el cual pondremos la definicion
del tipo y la declaraciones de las variables y funciones a utilizar, llamemoslo fraccionario.h
y contendrá:
#include <stdio.h>
#ifndef _fraccionario_ /*sentencia del preprocesador de c, sirve para comprobar que no
hay otro tipo fraccionario en cuyo caso no podra ser definido nuestro TAD*/
#define _fraccionario_
typedef struct estructura{
int numerador;
int denominador; /*numero fraccionario tipo-> 1/2,2/4,5/6.....*/
}tipofraccion;
typedef tipofraccion *fraccionario;
fraccionario crear_fraccion(int x,int y);/*crea la fraccion*/
void destruir_fraccion(fraccionario f);/*libera la memoria*/
int numerador(fraccionario f);/*devuelve denominador de f*/
int denominador(fraccionario f); /*devuelve denominador de f*/
void producto(fraccionario f,fraccionario g); /*suma f=f*g*/
#endif
antes de pasar a la siguiente parte deberemos de comprender una question fundamental a la hora
de diseñar un TAD; la ocultación de informacion. Algunos de ustedes que lean esto se
preguntarán por que no he utilizado tipofraccion directamente en vez de utilizar un puntero a
estructura.
Bien esto es debido por que a la hora de implementar el tad si hubiese sido un estructura, a
la hora de tener que modificarla habría tenido que haberse pasado por referencia cargandose
la ocultacion de información. siendo por ejemplo la funcion producto asi: void producto(fraccionario *f,fraccionario g). si no fuese asi se pasaria por valor y fraccion f no se modificaría.
2º Una vez tengamos definido nuestro TAD, deberemos de implentar las funciones en un archivo de extencion .c, llamemoslo fichero.c:
#include "fraccionario.h"
#include <stdio.h>
#include <stdlib.h>
fraccionario crear_fraccion(int x,int y){
fraccionario f;
f=(fraccionario)malloc(sizeof(tipofraccion));
if(f==NULL){
printf("error: no hay memoria\n");
exit(1);
}
f->numerador=x;
f->denominador=y;
return f;
}
void destruir_fraccion(fraccionario f){
free(f);
}
int numerador(fraccionario f){
return f->numerador;
}
int denominador(fraccionario f){
return f->denominador;
}
void producto(fraccionario f,fraccionario g){
f->numerador*=g->numerador;
f->denominador*=g->denominador;
}
debemos de anotar que esto es una version del numero fraccionario simplificada y hecha de
manera introductoria para una persona que nunca ha visto nada de esto y no le resulte muy
pesado.
3ºutilizacion dentro de nuestros programas
#include <stdio.h>
#include <stdlib.h>
#include "fraccionario.h"
int main (void){
fraccionario f,g;
f=crear_fraccion(2,4);
g=crear_fraccion(3,5);
producto(f,g);
printf("el resultado de multiplicar 2/4f con g es: %d,%d\n",numerador(f),denominador(f));
destruir_fraccion(f);
destruir_fraccion(g);
return 0;
}
espero que sirva de ayuda para quien quiera introducirse en la programación con tipos
abstractos de datos.

