Librerías auxiliares en C para teoría de algoritmos

Librerías auxiliares en C para teoría de algoritmos

Para trabajar con teoría de algoritmos, los estudiantes tendrán que desarrollar librerías que faciliten su trabajo. Con esto se ahorrarán muchísimas horas de codificación en el desarrollo de sus algoritmos.

Dos cuestiones que resultan básicas. La primera es las gestión de estructuras de datos lineales como los arrays. Particularmente esta estructuras, concretamente matrices, los utilizaremos con muchísima frecuencia en la llamada programación dinámica. En segundo lugar dejaremos una librería de gestión de ficheros. Más adelante, conforme vayamos avanzando, nos percataremos de su importancia.

Mi intención en éste artículo es dejaros una propuesta de una librería de matrices. Es más que suficiente para resolver muchos de los problemas de algorítmica que iremos tratando en éste blog. La primera parte del código que listaremos es la declaración de funciones y procedimientos en el fichero .h:

/* Modulo en C para el uso de objetos ARRAYS DINµMICOS 2D */

#ifndef ARDIS2D

#define ARDIS2D

typedef int **imatriz2d;

imatriz2d icreamatriz2d (unsigned int nf, unsigned int nc);
void ifreematriz2d (imatriz2d *matriz2d);

#endif

En este código definimos una matriz de números enteros y dos procedimientos, el primero crea una matriz con las dimensiones que les pasamos como argumentos, y el segundo libera la memoria que ocupa la matriz; actuaría como un destructor, si hablaramos de programación orientada a objetos.

En lo que respecta al fichero .c de la librería, es como sigue:

/*  Modulo en C para el uso de objetos ARRAYS DINµMICOS 2D */

#include <stdio.h>
#include <stdlib.h>
#include "array2d.h"

imatriz2d icreamatriz2d (unsigned int nf, unsigned int nc){
	imatriz2d m;
	unsigned long datasize = nc * nf * sizeof (int);
	unsigned long indexsize = nf * sizeof (int *);
	int i;

	if ((m=(imatriz2d)malloc(indexsize)) == NULL){
		(void) fprintf (stderr, "\nicreamatriz: No hay memoria.\n");
		exit (1);
	}
	if (((m)[0] = (int *)malloc(datasize)) = =NULL){
		(void) fprintf (stderr, "\nicreamatriz: No hay memoria.\n");
		exit (1);
	}
	for (i=1; i<nf; i++)
		 (m)[i] = (m)[i-1]+nc;
	return ((imatriz2d) m);
}

/*-------------------------------------------------------------------------*/

void ifreematriz2d (imatriz2d *matriz2d){

	if (*matriz2d){
		if (*matriz2d[0])
			(void) free ((int *) ((*matriz2d) [0]));
		(void) free ((int *) (*matriz2d));
	}
	matriz2d = NULL;
}

La gestión de ficheros en c/c++ es bastante sencilla. No obstante, como siempre digo, es bueno ahorrarse tiempo de codificación y reutilizar líneas de código que ya hayamos probado. Comenzamos con el fichero .h:

/*------------------------------------------------------------------------*/
/*                      Este es el fichero de cabeceras                   */
/*                        de la librer¡a LIB_FICH.C                       */
/*------------------------------------------------------------------------*/

#ifndef FICHLIB

#define FICHLIB

FILE *existe (char *fich);
int creadir (char *nomb_fich[]);
#endif

Ahora dejamos el código del fichero .c:

/*-------------------------------------------------------------------------*/
/*   LA LIBRERIA LIB_FICH CONTIENE FUNCIONES PARA EL MANEJO DE FICHEROS    */
/*-------------------------------------------------------------------------*/

#include <stdio.h>
#include <process.h>
#include <dir.h>

/*--------------------------- Funci¢n existe-------------------------------*/

/*	La funci¢n existe comprueba si el nombre de fichero que le pasamos existe
o no. En caso de existir lo abre para a¤adir y de no existir lo crea en ambos
casos para lectura/escritura.

Precondiciones  : Que haya memoria.
Postcondiciones : Devuelve un FILE * que es el descriptor de fichero del
		nombre dado. Dicho descriptor ha de ser cerrado en el
						m¢dulo llamador.*/


FILE * existe (char *fich) {

	FILE *fp;      /*variable autom tica => existencia local*/

	if ((fp = (fopen (fich, "a+"))) == NULL){
		/*Error al abrir el fichero: no hay memoria o el fichero no existe*/
		if ((fp = (fopen (fich, "rw"))) == NULL){
			printf ("Error: no hay memoria o el nombre no es v lido\n");
			exit (1);
		}

	}

	return ((FILE *)fp);

}
/*------------------------------- FIN EXISTE ------------------------------*/

/*---------------------------- FUNCIàN CREADIR ----------------------------*/


/* La funci¢n creadir crea un directorio con el nombre del par metro dado.

	Precondiciones : Debe haber memoria.

	Postcondiciones: Devuelve un c¢digo entero indicando el resultado: 0 si
			tiene ‚xito, 5 si el directorio ya existe o 2 si el
			nombre es incorrecto. */

int creadir (char *nomb_dir) {
	extern int errno;
	if ((mkdir(nomb_dir))==-1){
		if (errno == 5) return 5; /* El directorio ya existe */
		if (errno == 2) return 2; /* El nombre no es v lido  */
		/* Directamente pod¡amos haber puesto return (errno) pero considero
		que as¡ el c¢digo da m s informaci¢n de lo que se hace.
		En una optimizaci¢n para velocidad ser¡a inexcusable dejarlo as¡ */
	}
	return 0; /* Hemos creado el directorio */
}
/*--------------------------- FIN CREADIR ---------------------------------*/

No Comments

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.