Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Antoniosp

[Resolvido] [Código] Calcular Determinante

Recommended Posts

Olá Galera,

 

Eu costumo postar lá na área de flash mas estou estudando c também e resolvi postar aqui um programa que fiz:

 

#include <stdio.h>

//Prototypes
int  det(int**,int);
int**matrizMenor(int**,int**,int,int);
int**alocarMQ(int);
int**freeMQ(int**,int);
void printMQ(int**,int);

int main(int argc, char *argv[]){
	int ordem, **matriz, i, j;
	
	//Recuperando a ordem da matriz
	printf("** Calculando o determinante de matrizes reais. **\n\n");
	printf("Digite a ordem desejada da matriz: ");
	scanf("%d", &ordem);
	
	//Alocando espaço da matriz quadrada
	matriz = alocarMQ(ordem);
	
	//Preenchendo a matriz
	printf("\nDigite os valores da matriz (da direita para a esquerda,\
 de cima para baixo):\n");
	for(i=0; i<ordem; i++)
		for(j=0; j<ordem; j++)
			scanf("%d", &matriz[i][j]);
	
	//Imprimindo a matriz e seu determinante
	printf("\nA matriz eh:\n\n");
	printMQ(matriz, ordem);
	printf("\nO Determinante eh: %d\n", det(matriz, ordem));
	
	getchar();
	getchar();
	return 0;
}

//Retorna o determinante da matriz m de ordem n por Laplace
int det(int **m, int n){
	//Caso fundamental
	if(n == 1)
		return **m;
	
	//Criando a matriz do cofator
	int c, cof, d=0, **m2 = alocarMQ(n-1);
	
	//Para cada coluna
	for(c=0; c<n; c++){
		//Calculando o cofator
		cof = (c%2?-1:1) * det(matrizMenor(m, m2, c, n), n-1);
		//Somando a parcela ao determinante final
		d += m[0][c]*cof;
	}
	
	//Liberando o espaço alocado da matriz do cofator
	freeMQ(m2, n-1);
	
	//Retornando o determinante
	return d;
}

//Retira a primeira linha a coluna c de m e armazena em m2. n é a ordem de m
int **matrizMenor(int **m, int **m2, int c, int n){
	int i, j, **p=m2, *p2;
	for(i = 1; i < n; i++){
		p2 = *p++;
		for(j = 0; j < n; j++)
			if(j==c) continue;
			else *p2++ = m[i][j];
	}
	return m2;
}

//Aloca espaço para uma matriz quadrada
int **alocarMQ(int n){
	int **m, i;
	m = (int**)calloc(n, sizeof(int*));
	if(m == NULL) exit(1);
	for(i=0; i<n; i++){
		*(m+i) = (int*)calloc(n, sizeof(int));
		if(*(m+i) == NULL) exit(1);
	}
	return m;
}

//Desaloca espaço de uma matriz quadrada
int **freeMQ(int **m, int n){
	int i;
	if(m == NULL) return NULL;
	for(i=0; i<n; i++) free(m[i]);
	free(m);
	return NULL;
}

//Imprime uma matriz quadrada
void printMQ(int **m, int n){
	int i, j;
	for(i = 0; i < n; i++){
		printf("[");
		for(j = 0; j < n; j++)
			printf(" %2d", m[i][j]);
		printf(" ]\n");
	}
}

Esse foi meu primeiro experimento com alocação de memória. Queria aproveitar para que vocês avaliassem isso, se está certo mesmo e tal. Mas que funciona, funciona :P

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.