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.
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").
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.
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>
#include <stdlib.h>
int main() {
int m, n;
double **mat;
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;
}