Calcular determinante de matrizes
A jucald.h contém uma função para cálculo de determinante de matrizes de qualquer dimensão. Utiliza função recursiva, e dá uma aula de como funcionam ponteiros para matrizes.
Descrição
A jucald.h contém uma função para cálculo de determinante de matrizes de qualquer dimensão. Utiliza função recursiva, e dá uma aula de como funcionam ponteiros para matrizes.
/*---------------------------------------------------------------------------
jucald.h
Autor: Jefferson dos Santos Felix, Abril 2004
Este header contem uma funcao que efetua o calculo de determinante de matrizes
de qualquer dimensao. Ela utiliza o principio de que a determinante de uma
matriz eh a soma das determinantes de matrizes menores, baseadas na matriz
principal. Como se pode notar, trata-se de uma funcao recursiva, por isso o
nome (hehe): Jucald (sigla de Jucald, Um CALculador de Determinantes).
Sintaxe da funcao:
long determ(int *m, int s);
- m: matriz
- s: a sua dimensao (sxs)
A funcao determ() retorna o valor da determinante (em inteiro longo).
Obs: Alteracoes poderao ser feitas livremente no codigo se houver a necessidade
de se utilizar numeros reais (float) na matriz.
Exemplo de programa que usa jucald.h com uma matriz 3x3:
---------------------------------------------------------------------------
// exemplo.c
#include <stdio.h>
#include "jucald.h"
int main(void)
{
int m[3][3], x, y;
for(x = 0; x < 3; x++)
for(y = 0; y < 3; y++)
{
printf("MATRIZ[%d][%d]: ", x+1, y+1);
scanf("%d", &m[x][y]);
}
printf("Determinante: %d\n", determ(*m, 3));
return 0;
}
---------------------------------------------------------------------------
Observacao:
-----------
Lembramos que a funcao determ() pede um ponteiro *m e matrizes geralmente sao
ponteiros do tipo **m. Para corrigir possiveis warnings na compilacao, a
matriz deve ser declarada na funcao como foi feito no exemplo acima,
entretanto o programa deve funcionar tambem como abaixo:
....
int m[3][3];
long d;
....
d = determ(m, 3);
....
A diferenca eh que este procedimento gera um warning na maioria dos
compiladores C.
*/
#ifndef __JUCALD_H
#define __JUCALD_H
long determ(int *m, int s);
int dellc(int *m, int *m2, int lin, int col, int s);
long determ(int *m, int s)
{
long detbuf = 0; // Armazena a determinante parcial
int *m2;
int c;
int h, i;
if(s == 0)
return 0;
if(s == 1)
return *m;
m2 = (int *)calloc(s*s, sizeof(int));
for(c = 0; c < s; c++)
{
dellc(m, m2, 0, c, s); // Elimina a linha 0 e a coluna c da matriz m e
// armazena em m2
if(!(c%2))
detbuf+= determ(m2, s-1) * *(m+c); //Se for par soma determinante de m2
else
detbuf-= determ(m2, s-1) * *(m+c); //Se impar subtrai a determ. de m2
}
return detbuf;
}
int dellc(int *m, int *m2, int lin, int col, int s)
{
int cont;
// Copia a Matriz m para m2
for(cont = 0; cont < s*s; cont++)
*(m2+cont) = *(m+cont);
// Exclui a linha lin ( A ultima linha eh excluida automaticamente atraves
// da expressao s*(s-1) )
for(cont = 0; cont < s*(s-1); cont++)
if(cont>=(lin*s))
*(m2+cont) = *(m2+cont+s);
//Exclui a coluna col ( A ultima coluna eh excluida automaticamente atraves
// da expressao (s-1)*(s-1) )
for(cont = 0; cont < (s-1)*(s-1); cont++)
if(!((cont-col)%s))
*(m2+cont) = *(m2+cont+1);
return 0;
}
#endif
Não é uma crítica! Achei muito legal a recursividade e só gostaria de saber onde está acontecendo a falha! Obrigado adson@expertid.com.br