Confirmação de resultado com matriz transposta – linguagem C

Elabore um algoritmo que receba uma matriz quadrada de ordem n. Primeiro será fornecido o valor de n e depois os valores de uma matriz A. Por fim serão fornecidos valores para uma outra matriz, matriz B. O algoritmo deve comparar se a matriz B é o resultado correto da multiplicação da matriz A por sua transposta.

Exemplo:

EntradaSaída
2
1 2
4 5
5 14
14 41
correto
2
1 2
4 5
5 14
14 14
incorreto


Solução em C, sem função

#include <stdio.h>

int main(void) {
	int tam, i, j, k, soma;
	scanf("%i", &tam);
	int mA[tam][tam], mB[tam][tam], mT[tam][tam], mR[tam][tam];
	
	//ler matriz A e depois matriz B
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			scanf("%i", &mA[i][j]);
		}
	}
	
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			scanf("%i", &mB[i][j]);
		}
	}
	
	//transposta
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			mT[i][j] = mA[j][i];
		}
	}
	
	//multiplica
	for (i=0; i<tam; i++) {
		for (k=0; k<tam; k++) {
			soma = 0;
			for (j=0; j<tam; j++) {
				soma = soma + mA[i][j] * mT[j][k];
			}
			mR[i][k] = soma;
		}
	}

	//compara matrizes
	int iguais = 1;
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			if (mR[i][j] != mB[i][j]) {
				iguais = 0;
				printf("diferentes na posicao %i e %i\n", i, j);
				break; //faz para os FOR quando achar
			}
		}
	}
	if (iguais) {
		printf("correto\n");
	} else {
		printf("incorreto\n");
	}
	
	//apenas para mostrar os valores das matrizes
	printf("Matriz A\n");
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			printf("%i ", mA[i][j]);
		}
		printf("\n");
	}
	printf("\nMatriz A'\n");
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			printf("%i ", mT[i][j]);
		}
		printf("\n");
	}
	printf("\nMatriz B\n");
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			printf("%i ", mB[i][j]);
		}
		printf("\n");
	}
	printf("\nMatrizA * MatrizA'\n");
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			printf("%i ", mR[i][j]);
		}
		printf("\n");
	}
}

Teste o código: http://ideone.com/nfopWm

Solução em C, com função

#include <stdio.h>

void mostraMatriz(int tam, int mat[tam][tam]) {
	int i, j;
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			printf("%i ", mat[i][j]);
		}
		printf("\n");
	}
}

void transposta(int tam, int mA[tam][tam], int mT[tam][tam]) {
	int i, j;
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			mT[i][j] = mA[j][i];
		}
	}
}

void multiplica(int tam, int mA[tam][tam], int mB[tam][tam], int mR[tam][tam]) {
	int i, j, k, soma;
	for (i=0; i<tam; i++) {
		for (k=0; k<tam; k++) {
			soma = 0;
			for (j=0; j<tam; j++) {
				soma = soma + mA[i][j] * mB[j][k];
			}
			mR[i][k] = soma;
		}
	}
}

int main(void) {
	int tam, i, j;
	scanf("%i", &tam);
	int mA[tam][tam], mB[tam][tam], mR[tam][tam], mT[tam][tam];
	
	//ler matriz A e depois matriz B
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			scanf("%i", &mA[i][j]);
		}
	}
	
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			scanf("%i", &mB[i][j]);
		}
	}
	
	//transposta
	transposta(tam, mA, mT);
	//multiplica
	multiplica(tam, mA, mT, mR);

	//compara matrizes
	int iguais = 1;
	for (i=0; i<tam; i++) {
		for (j=0; j<tam; j++) {
			if (mR[i][j] != mB[i][j]) {
				iguais = 0;
				printf("diferentes na posicao %i e %i\n", i, j);
				break; //faz para os FOR quando achar
			}
		}
	}
	if (iguais) {
		printf("correto\n");
	} else {
		printf("incorreto\n");
	}
	
	//apenas para mostrar os valores das matrizes
	printf("Matriz A\n");
	mostraMatriz(tam, mA);
	printf("\nMatriz B\n");
	mostraMatriz(tam, mB);
	printf("\nMatrizA * MatrizA'\n");
	mostraMatriz(tam, mR);
}

Teste o código: http://ideone.com/XfLNyv

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.