Ir ao conteúdo

Posts recomendados

Postado

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);
}

 

Postado

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
Postado
#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?

 

Postado

@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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!