sábado, 22 de febrero de 2014

Introducción a la programación modular




Hemos visto como debemos agregar -lm para usar la librería matemática de C, esta librería la podemos encontrar en /usr/include/math.h y /usr/lib/x86_64-linux-gnu/libm.so o /usr/lib/x86_64-linux-gnu/libm.a, revisemos estos archivos.
Vemos también que debimos incluir esta librería math.h.
En el archivo .h se encuentran los prototipos de las funciones y en el .so o .a se encuentra el binario de la implementación de esas funciones.
Se llama archivo fuente a el código en c que genera esos binarios-y contiene la definición de las funciones-, archivo de cabecera (header) al .h, al archivo .a se le llama librería estática y al .so librería dinámica.
la distribución de esta manera del código se le llama programación modular, es un tipo de diseño de software.

Convirtamos el algoritmo de autovalores en un módulo y su implementación:

autovalores.h
#ifndef AUTOVALORES_H
#define AUTOVALORES_H

int det(int A[2][2]);
int tra(int A[2][2]);
double* autovalores(int A[][2]);

#endif


autovalores.c
#include"autovalores.h"
#include<math.h>

int det2(int A[2][2])
{
    return A[0][0]*A[1][1]-A[0][1]*A[1][0];
}
int tra2(int A[2][2])
{
    return A[0][0]+A[1][1];
}
double* autovalores(int A[][2])
{
    static double lambda[2];
 int tra=tra2(A);
 lambda[0]= (tra+sqrt(tra*tra-4*det2(A)))/2;
 lambda[1]= (tra-sqrt(tra*tra-4*det2(A)))/2;

 return lambda;
}


problema.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


#include"autovalores.h"

int main()
{
    srand(time(NULL));
    int a[2][2];
 int i,j;
 double *lambda;//Se define como puntero pues la función retorna tal.

 for(i=0;i<2;i++) {
     for(j=0;j<2;j++) {
      a[i][j]=rand()%10-5;
   printf("%d ",a[i][j]);
  }
  printf("\n");
 }

    lambda=autovalores(a);
 printf("Los autovalores son %f y %f\n",lambda[0], lambda[1]);

    return 0;
}

Y compilamos con.
gcc autovalores.c problema.c -lm -o autovalores

Ejercicios
  • Haga una cabecera y un archivo de fuente para las funciones de manejo vectorial y matricial.

No hay comentarios:

Publicar un comentario