spdm
-
Total de itens
6 -
Registro em
-
Última visita
Posts postados por spdm
-
-
E ai Marcelo, beleza?
Bom, o protótipo da função é esse:
int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B);
Do ponteiro é: int *matriz3;
A função é:
int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B)
{
int cont,cont2,cont3,resultado[la][cb],acumula;
for(cont = 0; cont<la;cont++)
{
for(cont2 = 0;cont2 < cb; cont2++)
{
acumula = 0;
for(cont3 = 0;cont3 < ca; cont3++)
{
acumula += *(a+(cont * ca+cont3)) * *(b+(cont3 * cb+cont2));
}
resultado[cont][cont2] = acumula;
}
}
return &resultado[0][0];
}
Grato pela atenção.
-
Olá pessoal,
Sou iniciante em c, e estou estudando alocação dinâmica de memória e ponteiros e eu pensei que estava entendendo bem até ocorrer um problema. Refiz um programinha que calcula a multiplicação de duas matrizes que o usuário escolhe quantas linhas e quantas colunas as matrizes vão ter, testa se a coluna da primeira matriz é igual a linha da segunda e em caso positivo, aloca dinamicamente memória para essas matrizes. Para isso criei uma função para multiplicar as matrizes que retorna um ponteiro.
Eu queria atribuir esse ponteiro retornado pela função a outro ponteiro para posteriormente em um laço for imprimir o resultado na tela. O problema é que quando eu atribuo o valor de retorno da função a outro ponteiro e depois vou acessar os elementos desse ponteiro, ele me retorna valores completamente errados que, ao que tudo indica, estão em endereço de memória nada a ver.
No entanto, se eu fizer o mesmo processo de modo direto, usando o retorno da função diretamente no laço for sem atribuí-lo a outro ponteiro, o programa funciona normalmente.
Por que não consigo fazer da primeira maneira? Estou fazendo algo errado?
Se eu faço dessa maneira logo abaixo, não funciona.
matriz3 = multMatriz(linhas,colunas,matriz1,linhas2,colunas2,matriz2);
for(cont=0; cont< linhas; cont++)
{
for(cont2 = 0;cont2 < colunas2; cont2++)
{
printf(" %d ",*(matriz3+(cont * colunas2 + cont2)));
if(cont2 == colunas2 - 1)
{
printf("\n");
}
}
}
Mas se eu faço de maneira de maneira direta funciona:
for(cont=0; cont< linhas; cont++)
{
for(cont2 = 0;cont2 < colunas2; cont2++)
{
printf(" %d ",*(matriz3 = multMatriz(linhas,colunas,matriz1,linhas2,colunas2,matriz2)+(cont * colunas2 + cont2)));
if(cont2 == colunas2 - 1)
{
printf("\n\n");
}
}
}
Onde está meu erro? Se puderem ajudar, eu agradeço.
-
Valeu Marcelo por se dispor a ajudar.
"Pelejando" aqui, consegui resolver o problema(só não sei se fiz da melhor maneira). O exercício pede para calcular a determinante, a matriz de cofatores, a matriz adjunta, a matriz inversa e também para provar que a matriz realmente é inversa multiplicando-a pela matriz original.
Segue o código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int cofatores(int l,int c, int m[3][3]);
int menorComplementar(int l,int c, int m[3][3]);
int laplace(int cofator1, int cofator2, int cofator3, int m[3][3]);
int main()
{
/*5) Crie um programa em C que leia uma matriz 3x3 de inteiros. O programa deve calcular e
mostrar:
a) O determinante da matriz
B) A matriz de cofatores dessa matriz
c) A matriz adjunta dessa matriz
d) A matriz inversa dessa matriz
Teste a matriz inversa multiplicando a matriz original pela inversa e verificando se o
resultado é a matriz identidade. (use os exercícios 4 e 1)*/
int matriz[3][3], matrizCof[3][3],matrizAdjunta[3][3],cont,cont2;
float matrizInversa[3][3],determinante,vetorLinha1[3],vetorLinha2[3],vetorLinha3[3];
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
printf("\nDigite um valor para preencher a posicao [%d][%d] da matriz:",cont,cont2);
scanf("%d",&matriz[cont][cont2]);
}
}
determinante = laplace(cofatores(0,0,matriz),cofatores(0,1,matriz),cofatores(0,2,matriz),matriz);
printf("\n1 - O determinate da matriz digitada e: %.1f\n\n",determinante);
printf("2 - Matriz de cofatores:\n\n");
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
matrizCof[cont][cont2] = cofatores(cont,cont2,matriz);
printf(" %d ",matrizCof[cont][cont2]);
if(cont2 == 2)
{
printf("\n");
}
}
if(cont == 2)
{
printf("\n");
}
}
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
matrizAdjunta[cont2][cont] = matrizCof[cont][cont2];
}
}
printf("\n\n3 - Matriz Adjunta:\n\n");
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
printf(" %d ",matrizAdjunta[cont][cont2]);
if(cont2 == 2)
{
printf("\n");
}
}
}
printf("\n\n4 - Matriz inversa:\n\n");
if(determinante != 0)
{
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
matrizInversa[cont][cont2] = matrizAdjunta[cont][cont2] * (1/determinante);
}
}
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2 < 3; cont2++)
{
printf(" %f ",matrizInversa[cont][cont2]);
if(cont2 == 2)
{
printf("\n");
}
}
}
for(cont = 0;cont < 3; cont++)
{
vetorLinha1[cont] = 0;
vetorLinha2[cont] = 0;
vetorLinha3[cont] = 0;
}
for(cont =0;cont < 3; cont++)
{
for(cont2= 0;cont2<3;cont2++)
{
if(cont == 0)
{
vetorLinha1[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);
}
if(cont == 1)
{
vetorLinha2[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);
}
if(cont == 2)
{
vetorLinha3[cont] += (matriz[cont][cont2] * matrizInversa[cont2][cont]);
}
}
}
printf("\n5 - Multiplicacao da matriz inserida pelo usuario pela sua inversa:\n\n");
for(cont=0;cont < 3; cont++)
{
printf(" %.1f ",vetorLinha1[cont]);
}
printf("\n");
for(cont=0;cont < 3; cont++)
{
printf(" %.1f ",vetorLinha2[cont]);
}
printf("\n");
for(cont=0;cont < 3; cont++)
{
printf(" %.1f ",vetorLinha3[cont]);
}
}
else
{
printf("\n\n - não foi possivel encontar a matriz inversa(determinante igual a 0)\n");
}
return 0;
}
int cofatores(int l,int c,int m[3][3])
{
int cont,cont2,cofator, flag=0;
for(cont=0;cont<3;cont++)
{
for(cont2=0;cont2<3;cont2++)
{
if(l == cont && c == cont2 )
{
cofator = pow(-1,cont+cont2) * menorComplementar(l,c,m);
flag = 1;
}
else
{
flag = 0;
}
if(flag == 1)
{
break;
}
}
if(flag == 1)
{
break;
}
}
return cofator;
}
int menorComplementar(int l,int c,int m[3][3])
{
int cont,cont2,cont3,cont4,cont5, cont6, cont7, cont8, cont9, cont10, det,n[2][2];
int contador = 0;
for(cont = 0; cont < 3; cont++)
{
for(cont2 = 0; cont2<3; cont2++)
{
if(cont != l && cont2 != c)
{
contador = contador + 1;
if (contador == 1)
{
cont3 = cont;
cont4 = cont2;
}
if (contador == 2)
{
cont5 = cont;
cont6 = cont2;
}
if (contador == 3)
{
cont7 = cont;
cont8 = cont2;
}
if (contador == 4)
{
cont9 = cont;
cont10 = cont2;
}
}
}
}
n[0][0]= m[cont3][cont4];
n[0][1]= m[cont5][cont6];
n[1][0]= m[cont7][cont8];
n[1][1]= m[cont9][cont10];
det = (n[0][0] * n[1][1]) - (n[0][1] * n[1][0]);
return det;
}
int laplace(int cofator1, int cofator2, int cofator3,int m[3][3])
{
int cont, cont2, det=0,flag =0;
for(cont =0; cont < 3; cont++)
{
for(cont2 = 0; cont2 <3;cont2++)
{
if(cont == 0 && cont2 == 0)
{
det = cofator1 * m[cont][cont2];
}
if(cont == 0 && cont2 == 1)
{
det += (cofator2 * m[cont][cont2]);
}
if(cont == 0 && cont2 == 2)
{
det += (cofator3 * m[cont][cont2]);
flag = 1;
}
}
if(flag == 1)
{
break;
}
}
return det;
}
Desculpe ai galera, o código perdeu a indentação depois que eu postei e ficou meio confuso.
-
errata: menor complementar e não matriz complementar.
-
Olá pessoal,
Estou começando a estudar C no meu curso(automação industrial), e me enrolei para fazer um dos exercícios pedidos.
Preciso extrair de uma matriz 3x3 sua matriz complementar. Tentei criar uma função para isso, mas não achei a lógica correta para faze-la funcionar corretamente.
Alguém poderia postar um exemplo?
Grato.
Dúvida sobre atribuir o retorno de uma função que retorna o ponteiro a
em C, C++
Postado
Obrigado Marcelo, você tinha toda a razão quanto ao fato de precisar alocar memória para o ponteiro antes de retorná-lo. Fiz uma pequena alteração no código da função e funcionou perfeitamente. Valeu mesmo.
Vou deixar o código da função, para caso alguém tenha uma dúvida semelhante:
//Multiplica duas matrizes. São passados como argumentos as linhas e colunas das duas matrizes, e
//um ponteiro para cada matriz
int *multMatriz(int la, int ca,int *a,int lb, int cb, int *B)
{
int cont,cont2,cont3,*p,resultado[la][cb],acumula, *mat;
mat=(int*) malloc(la * cb * sizeof(int));
for(cont = 0; cont<la;cont++)
{
for(cont2 = 0;cont2 < cb; cont2++)
{
acumula = 0;
for(cont3 = 0;cont3 < ca; cont3++)
{
acumula += *(a+(cont * ca+cont3)) * *(b+(cont3 * cb+cont2));
}
*(mat +(cont * cb + cont2))= acumula;
}
}
return mat;
}