Ir para conteúdo
Fórum Script Brasil

spdm

Membros
  • Total de itens

    6
  • Registro em

  • Última visita

Posts postados por spdm

  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.

×
×
  • Criar Novo...