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, depois os valores de uma matriz A. Por fim serão fornecidos valores para uma outra matriz B e o algoritmo deve comparar se a matriz B é o resultado correto da multiplicação da matriz A por sua transposta (matrizA * matrizA’).
Escreva “correto” se o resultado confere, e “incorreto”, caso contrário.
Exemplos:
Entrada | Saí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