Ir ao conteúdo
  • Cadastre-se

C Multiplicação de matrizes (alocação dinâmica usando função double)


Posts recomendados

Crie um programa que multiplica duas matrizes quadradas do tipo double lidas do teclado. Seu programa deve ler a dimensão n da matriz, em seguida alocar dinamicamente duas matrizes n × n. Depois ler os dados das duas matrizes e imprimir a matriz resultante da multiplicação destas.

#include<stdio.h>
#include<stdlib.h>
int main ()
{
  int matriz[3][3],i, j;

  printf ("\nDigite valor para os elementos da matriz\n\n");

  for ( i=0; i<3; i++ )
    for ( j=0; j<3; j++ )
    {
      printf ("\nElemento[%d][%d] = ", i, j);
      scanf ("%d", &matriz[ i ][ j ]);
    }

  printf("\n\n******************* Saida de Dados ********************* \n\n");

  for ( i=0; i<3; i++ )
    for ( j=0; j<3; j++ )
    {
      printf ("\nElemento[%d][%d] = %d\n", i, j,matriz[ i ][ j ]);
    }

  getch();
  return(0);
}

 

Link para o comentário
Compartilhar em outros sites

Oi@paulo luz magalhaes Sei que existem algoritmos eficientes para multiplicar duas matrizes quadradas, porém você pode está escolhendo escrever o cálculo diretamente pela definição intuitiva.

 

Inicialmente é necessário verificar se as matrizes satisfazem a condição de produto: o número de colunas de A é igual ao número de linhas de B. (i,n=n,y)

 

O resultado terá A linhas, B colunas. (i,y).

 

***Mas, como o problema envolve duas matrizes quadradas de dimensões iguais, a definição de produto é garantida em razão do enunciado.

 

 

Ainda na definição, o valor de um elemento da Matriz Produto é a soma de (n-1) produtos dos elementos de A, B.

 

P[i,y]= A[i,1] • B[1,y]  +...+ A[i,n-1] • B[n-1,y]

 

Sua complexidade é O(n³); nós sabemos que 3 loops são necessários para escrever esse cálculo em sua forma mais simples.

 

Nessa estrutura de 3 laços enraizados.

for( i ){

        for( y ){

                for( n ){

}       }      }       

 

Como disse anteriormente esse é o modo mais simples de apresentar sua solução.

 

 

Se não entendeu a maior parte do que expliquei, me diga que tentarei outras abordagens, mas antes sugiro que pesquise sobre assunto e se precisar traga perguntas objetivas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <stdlib.h>

main() {

//Definição de variaveis
int i, j, linhaA, colunaA, linhaB, colunaB, x;

//Entrada de dados
printf("\n Informe a quntidade de linhas da matriz A : ");
scanf("%d",&linhaA);
printf("\n Informe a quantidade de colunas da matriz A : ");
scanf("%d",&colunaA);
printf("\n Informe a quntidade de linhas da matriz B : ");
scanf("%d",&linhaB);
printf("\n Informe a quantidade de colunas da matriz B : ");
scanf("%d",&colunaB);

float matrizA[linhaA][colunaA], matrizB[linhaB][colunaB], matrizC[linhaA][colunaB], aux = 0;

if(colunaA == linhaB) {

	for(i = 0; i < linhaA; i++) {
		for(j = 0; j < colunaA; j++) {
			printf("\n\n Informe o valor da %d%c Linha e da %d%c Coluna da Matriz A: ", i+1, 167, j+1, 167);
			scanf("%f", &matrizA[i][j]);
		}
		printf("\n");
	}

	for(i = 0; i < linhaB; i++) {
		for(j = 0; j < colunaB; j++) {
			printf("\n\n Informe o valor da %d%c Linha e da %d%c Coluna da 2%c Matriz B: ", i+1, 167, j+1, 167, 167);
			scanf("%f", &matrizB[i][j]);
		}
		printf("\n");
	}

	// Imprime as matrizes definidas
	printf("---------------------------- 1 - Matriz Gerada ---------------------------------\n\n");

	for(i = 0; i < linhaA; i++) {
		for(j = 0; j < colunaA; j++) {
			printf("%6.f", matrizA[i][j]);
		}
		printf("\n\n");
	}

	printf("---------------------------- 2 - Matriz Gerada ---------------------------------\n\n");
	for(i = 0; i < linhaB; i++) {
		for(j = 0; j < colunaB; j++) {
			printf("%6.f", matrizB[i][j]);
		}
		printf("\n\n");
	}

	printf("---------------------------- 3 - Matriz Gerada ---------------------------------\n\n");

	//Processamento e saida em tela  =  PRODUTO DAS MATRIZES
	for(i = 0; i < linhaA; i++) {
		for(j = 0; j < colunaB; j++) {

			matrizC[i][j] = 0;
			for(x = 0; x < linhaB; x++) {
				aux +=  matrizA[i][x] * matrizB[x][j];
			}

			matrizC[i][j] = aux;
			aux = 0;
		}
	}

	for(i = 0; i < linhaA; i++) {
		for(j = 0; j < colunaB; j++) {
			printf("%6.f", matrizC[i][j]);
		}
		printf("\n\n");
	}
	printf("\n\n");
} else {
	printf("\n\n Nao ha com multiplicar as matrizes dadas ");
}

}
COMO SERIA NA ALOCAÇÃO DINAMICA USANDO A FUNÇÃO DOUBLE?

 

Link para o comentário
Compartilhar em outros sites

@paulo luz magalhaes 

Alocação dinâmica acontece quando um programa, já inicializado, solicita memória ao sistema operacional 

 

Uma situação tipica para uso da alocação dinâmica de memória é igual a essa que tem em seu código.

 

Sabemos que as funções malloc e calloc são responsáveis nos programas escritos em C pela solicitação de memória em tempo de execução. 

 

Reescrever um procedimento que usa VLA para alocação dinâmica e bastante fácil; sua lógica é praticamente igual.

 

Abaixo está demostração da matrizA sendo dinamicamente alocada.

 

        //Definição de variaveis
        int linhaA= 0, colunaA= 0;

        //Entrada de dados
        printf( "\n Informe a quntidade de linhas da matriz A : " );   scanf( "%d", &linhaA );
        printf( "\n Informe a quantidade de colunas da matriz A : " ); scanf( "%d", &colunaA );

        float (*matrizA)[colunaA]= calloc( linhaA, sizeof(*matrizA) );
        if( NULL == matrizA ){
                printf( "%s Falha ao Alocar Memoria!",__func__ );
                exit( 1 );
        }
        // ...
        printf( "%f", matrizA[0][0] );
        // ...
        free( (void *)matrizA );

**Após captura das dimensões o ponteiro matrizA é definido com VLA destinado a receber o endereço  de memória dinâmica.

 

É possível ter visto notação puramente de ponteiros, porém a de vetores é a que mais se aproxima da noção de tabelas e a primeira que aprendemos, o que a torna extremamente intuitiva, e não exige compreensão imediata de aritmética de ponteiros. É como uma transição suave, já que ponteiros são inevitáveis 

 

Uma recomendação de boas práticas é sempre liberar o que foi dinamicamente alocado quando não mais for necessário de modo a evitar perda de memória.

 

 

5 horas atrás, paulo luz magalhaes disse:

COMO SERIA NA ALOCAÇÃO DINAMICA USANDO A FUNÇÃO DOUBLE?

Desconheço a "Função Double", mas se nos questiona sobre alocação dinâmica de matrizes de dados double, então... não há diferença, basta trocar o tipo na variável.  

 

 

 

 Esse assunto pode ser bem difícil, então escreva com atenção porque a "brincadeira" é com a memória.  Se resta dúvida, pergunte.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...