Ir ao conteúdo
  • Cadastre-se

C++ Soma de duas Matrizes em C++


edupiombini

Posts recomendados

Prezados,

 

Preciso construir um programa que  que leia duas matrizes de reais (de no maximo 100x100), e mostre o resultado da soma,  caso não seja possivel somar, escrever na tela "Matrizes incompativeis para a soma!" 

Porém, sou extremamente leigo em C++

Vocês poderiam me ajudar?

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

  • Moderador

Caro usuário,

 

Seja bem-vindo ao Clube do Hardware.

 

No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.

 

Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.

 

Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.

 

Esperamos que compreenda.

 

Atenciosamente,

Equipe Clube do Hardware

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

@devair1010 A soma das matrizes só possível se essas forem de mesma ordem, ou seja, devem possuir o mesmo número de linhas e colunas.

Ainda estou tentando construir o código, até o momento só consigo fazer a leitura de duas matrizes, porém com o tamanho já definido.

No problema, o usuario deve determinar a ordem das matrizes com uma entrada de 1 a 100.

Agradeço desde já!

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

Você pode implementar uma matriz usando um vetor normal. Por exemplo, numa matriz 3 por 3, do tipo

 

a b c

d e f

g h i

 

os elementos podem ser agrupados num vetor convencional:

 

a b c d e f g h i

 

Se o numero de linhas é N e o numero de colunas é M, então

 

float *matrix = new float[N*M];

 

E o elemento a com coordenadas (n, m) pode ser encontrado com uma fórmula mágica:

 

a = matrix[n*N + m];

 

Essa técnica chama-se ordenamento row-major. De fato você pode reduzir qualquer tensor com varias dimensões num vetor 1D. Assim, pra uma matriz A e uma matriz B, a soma C seria algo tão simples quanto

 

for (int n = 0; n < N; ++n)
{
	for (int m = 0; m < M; ++m)
	{
		C[n*N + m] = A[n*N + m] + B[n*N + m];
	}
}

 

E quando N = M, tudo torna-se ainda mais simples (e extremamente eficiente):

 

for (int n = 0; n < N*M; ++n)
{
	C[n] = A[n] + B[n];
}

 

E por fim, como é um projeto em C++, você poderia empacotar os vetores, a inicialização de elementos, os operadores, destruição dos ponteiros etc. numa classe. Não é necessariamente importante mas dá o charme de C++.

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

@V!OLADOR muito obrigado! foi de grande ajuda!

Alguém saberia o porque de nunca entrar no primeiro "if" mesmo quando são digitados valores idênticos?

Sempre estou recebendo a mensagem que são incompatíveis para soma.

Agradeço desde já!

#include <stdio.h>

int main () {
	


int r1, c1, r2, c2;
printf("\nDigite o número de linhas da primeira matriz: \n");
scanf("%d", &r1);
printf("\nDigite o número de colunas da primeira matriz: \n");
scanf("%d", &c1);
printf("\nDigite o número de linhas da segunda matriz: \n");
scanf("%d", &r2);
printf("\nDigite o número de colunas da segunda matriz: \n");
scanf("%d", &c1);



if(c1 == c2 && r1 == r2){
	
int m1 [r1] [c1];
int m2 [r2] [c2];
int R [r2] [c2];
int i,j;

printf("\nDigite os valores da primeira matriz: \n");

for( i = 0; i < r1; i++){
    
	for( j = 0; j < c1; j++){
    	
    	scanf("%d", &m1[i][j]);
    	
	}  	
	
}

printf("\nDigite os valores da segunda matriz: \n");
for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	scanf("%d", &m2[i][j]);
    	
	}  	
	
}

for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	R[i][j]=m1[i][j]+m2[i][j];
    	
	}  	
	
}

printf("\nMatriz resultante: \n");

for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	printf("\t%d", &R[i][j]);
    	
	}  	
	
}
	
}

else{
	
	printf("\nMatrizes incompativeis para a soma!\n");
}

return 0;

}

 

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

@edupiombini  Olá,

Preste atenção no nome das variáveis, Você está especificando errado. na hora de pegar os valores com scanf().

1 hora atrás, edupiombini disse:

scanf("%d", &c1);

Você está recebendo os valores duas vezes na mesma variável.

 

Recomendo testar com valores pré definidos primeiro depois fazer o input, E utilizar nomes maiores e mais claros em variáveis para evitar que você cometa estes erros.

 

Espero ter lhe ajudado, até mais!

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

Tudo certo com o condicional, porém, a saída não faz a soma correta, acredito que esteja mostrando um endereço de memória

Matriz resultante:
        6487120 6487124 6487128 6487132

 

Alguem poderia me ajudar, por favor?

Agradeço desde já!

 

#include <stdio.h>

int main () {
	


int r1, c1, r2, c2;
printf("\nDigite o número de linhas da primeira matriz: \n");
scanf("%d", &r1);
printf("\nDigite o número de colunas da primeira matriz: \n");
scanf("%d", &c1);
printf("\nDigite o número de linhas da segunda matriz: \n");
scanf("%d", &r2);
printf("\nDigite o número de colunas da segunda matriz: \n");
scanf("%d", &c2);



if(r1 == r2 && c1 == c2){
	
int m1 [r1] [c1];
int m2 [r2] [c2];
int R [r2] [c2];
int i,j;

printf("\nDigite os valores da primeira matriz: \n");

for( i = 0; i < r1; i++){
    
	for( j = 0; j < c1; j++){
    	
    	scanf("%d", &m1[i][j]);
    	
	}  	
	
}

printf("\nDigite os valores da segunda matriz: \n");
for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	scanf("%d", &m2[i][j]);
    	
	}  	
	
}

for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	R[i][j] = m1[i][j] + m2[i][j];
    	
	}  	
	
}

printf("\nMatriz resultante: \n");

for( i = 0; i < r2; i++){
    
	for( j = 0; j < c2; j++){
    	
    	printf("\t%d", &R[i][j]);
    	
	}  	
	
}
	
}

else{
	
	printf("\nMatrizes incompativeis para a soma!\n");
}

return 0;

}

 

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

Em 07/10/2020 às 13:48, devair1010 disse:

se as matrizes são de números sempre terá como somar

 

O enunciado pode não ser muito objetivo, mas em geral vai considerar que se não tem o mesmo número de linhas e colunas não deve somar.

 

Até poderia, "projetando" uma sobre a outra e definindo algum tipo de soma.

 

Note que em C++ você pode definir a soma das matrizes. Algo como criar uma classe matriz e definir a soma, e escrever coisas como
 

Matriz A(5,10);
Matriz outra(3,2);
Matriz Resultado = A + outras;

 

C++ foi escrita com isso em mente.

 

 

Se  enunciado não obriga, nunca leia do teclado. É muito mais fácil ler de um arquivo que você pode editar no próprio IDE. E na hora de testar é muito mais fácil e rápido. Imagine duas matrizes 20x20... apenas 800 valores fora os tamanhos. Isso quer dizer que não vai testar direito...

  • Curtir 1
  • Obrigado 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...