Questão 10.

Escreva um programa para entrar com valores para uma matriz A_{n x n} simétrica.

Passo 1

O enunciado pede um programa que leia do usuário os valores de uma matriz A de ordem n tal que A seja simétrica, ou seja,
A_{ij} = A_{ji}
para todo 1 \le i,j \le n. 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 j \ge i), e em seguida completar a região abaixo da diagonal com
A_{ji} \leftarrow A_{ij}.

Passo 3

Implementamos dois laços aninhados:
  1. Laço externo em i de 0 até n-1.
  2. Laço interno em j de i até n-1.
    Em cada par (i,j) lido, fazemos
scanf("%d", &A[i][j]);
A[j][i] = A[i][j];

Passo 4

Depois de preencher toda a matriz, basta imprimir seus n^2 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;
}

Exercícios relacionados