Construa um programa que leia o número de linhas e de colunas de uma matriz de números reais, aloque espaço dinamicamente para esta e a inicialize com valores fornecidos pelo usuário. Ao final, o programa deverá retornar a matriz na saída padrão com layout apropriado.

Passo 1

A gente precisa criar um programa em C que leia o número de linhas e colunas de uma matriz de números reais, aloque esse espaço na memória dinamicamente, peça ao usuário para preencher todos os elementos e, por fim, imprima a matriz com um layout legal.

Passo 2

Primeiro, lemos as dimensões da matriz usando scanf para obter o número de linhas (m) e de colunas (n).
Em seguida, alocamos um vetor de ponteiros para double com tamanho m: esse vetor vai apontar para cada linha da matriz.
Para cada linha i, alocamos dinamicamente um bloco de n doubles. Assim temos m blocos que formam nossa matriz de m×n.

Passo 3

Depois de alocar tudo, usamos dois loops aninhados (i de 0 até m−1 e j de 0 até n−1) para ler cada valor da matriz usando scanf.
Feito o preenchimento, outra vez com dois loops aninhados, percorremos a matriz e imprimimos cada elemento com printf. A gente usa algo como printf("%8.2f", …) para alinhar direitinho e, ao fim de cada linha, dá um printf("\n").

Passo 4

Por fim, liberamos toda a memória: primeiro damos free em cada linha alocada, depois damos free no vetor de ponteiros.
Com isso, o programa termina sem vazamento de memória e mostra a matriz dinamicamente alocada e preenchida.

Resposta

#include <stdio.h>
#include <stdlib.h>
int main() {
int m, n;
double **mat;
// passo 1: ler dimensões
printf("Digite o número de linhas e colunas: ");
if (scanf("%d %d", &m, &n) != 2 || m <= 0 || n <= 0) {
    printf("Dimensões inválidas.\n");
    return 1;
}

// passo 2: alocar vetor de ponteiros (linhas)
mat = (double **)malloc(m * sizeof(double *));
if (mat == NULL) {
    printf("Falha na alocação de memória.\n");
    return 1;
}

// passo 3: alocar cada linha
for (int i = 0; i < m; i++) {
    mat[i] = (double *)malloc(n * sizeof(double));
    if (mat[i] == NULL) {
        printf("Falha na alocação de memória na linha %d.\n", i);
        // libera o que já tinha sido alocado
        for (int k = 0; k < i; k++) {
            free(mat[k]);
        }
        free(mat);
        return 1;
    }
}

// passo 4: ler valores da matriz
printf("Digite os %d×%d valores da matriz:\n", m, n);
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        scanf("%lf", &mat[i][j]);
    }
}

// passo 5: imprimir matriz com layout
printf("\nMatriz %dx%d:\n", m, n);
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        printf("%8.2f", mat[i][j]);
    }
    printf("\n");
}

// passo 6: liberar memória
for (int i = 0; i < m; i++) {
    free(mat[i]);
}
free(mat);

return 0;
}

Exercícios relacionados