Questão 10.
Escreva um programa para entrar com valores para uma matriz
simétrica.
Passo 1
O enunciado pede um programa que leia do usuário os valores de uma matriz
de ordem
tal que
seja simétrica, ou seja,
para todo
. O conteúdo é manipulação de matrizes e laços de repetição para preencher apenas metade da matriz e espelhar o valor.
Passo 2
Para aproveitar a simetria e evitar leituras redundantes, vamos ler apenas os elementos da diagonal principal e da região acima dela (onde
), e em seguida completar a região abaixo da diagonal com
Passo 3
Implementamos dois laços aninhados:
- Laço externo em
de até . - Laço interno em
de até .
Em cada parlido, fazemos
scanf("%d", &A[i][j]);
A[j][i] = A[i][j];
Passo 4
Depois de preencher toda a matriz, basta imprimir seus
valores em forma matricial. Só atenção à formatação: um espaço ou tabulação entre elementos e uma nova linha ao fim de cada linha.
Resposta
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, j;
int **A;
printf("Entre com a ordem n da matriz: ");
scanf("%d", &n);
// Aloca matriz n x n
A = malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
A[i] = malloc(n * sizeof(int));
}
// Lê apenas a diagonal e região acima, espelhando na região abaixo
printf("Entre com os elementos de A[i][j] para j >= i:\n");
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
printf("A[%d][%d] = ", i, j);
scanf("%d", &A[i][j]);
A[j][i] = A[i][j];
}
}
// Imprime a matriz completa
printf("\nMatriz simétrica A de ordem %d:\n", n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d\t", A[i][j]);
}
printf("\n");
}
// Libera memória
for (i = 0; i < n; i++) {
free(A[i]);
}
free(A);
return 0;
}