Jump to content
Fórum Script Brasil

spdm

Membros
  • Posts

    6
  • Joined

  • Last visited

About spdm

spdm's Achievements

0

Reputation

  1. 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; }
  2. 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.
  3. 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.
  4. 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.
  5. errata: menor complementar e não matriz complementar.
  6. 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.
×
×
  • Create New...