Faça um programa que leia quatro números
e
, que serão as dimensões de duas matrizes, e:
- Crie e leia uma matriz, dadas as dimensões dela;
- Crie e construa uma matriz que seja o produto de duas matrizes. Na sua função main(), imprima as duas matrizes e o produto entre elas, se existir.
Passo 1
Neste exercício vamos criar um programa em C que lê quatro inteiros a, b, c e d – correspondendo às dimensões de duas matrizes A (a×b) e B (c×d). Depois precisamos de uma função para alocar e ler uma matriz, outra para multiplicar matrizes, e no main() fazer a leitura, a multiplicação (se possível), impressão e liberação de memória.
Passo 2
Implementar a função criarLerMatriz. Ela recebe o número de linhas e colunas, aloca dinamicamente um vetor de ponteiros para as linhas, para cada linha aloca um vetor de colunas, percorre as posições lendo cada elemento via scanf() e retorna o ponteiro para o vetor de linhas.
Passo 3
Implementar a função multiplicarMatrizes. Ela recebe matrizes A e B e suas dimensões. Primeiro verifica se o número de colunas de A é igual ao número de linhas de B. Se não for, retorna NULL. Caso seja, aloca uma matriz resultado de dimensão linhasA×colunasB e preenche cada elemento resultado[i][j] somando A[i][k]·B[k][j] para k de 0 até colunasA-1.
Passo 4
No main(), declarar int a,b,c,d; ler os quatro valores com scanf(). Chamar criarLerMatriz(a,b) para A e criarLerMatriz(c,d) para B. Chamar multiplicarMatrizes(A,a,b,B,c,d) e guardar o retorno em C. Se C for diferente de NULL, imprimir A, B e C formatando linha a linha. Caso contrário, imprimir mensagem de incompatibilidade. Por fim, liberar a memória de A, B e (se não for NULL) de C.
Passo 5
Testar com entradas onde b==c (para confirmar que o produto é calculado corretamente) e com entradas onde b!=c (para confirmar que o programa detecta a incompatibilidade).
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
int **criarLerMatriz(int linhas, int colunas) {
int **m = malloc(linhas * sizeof(int *));
if (!m) return NULL;
for (int i = 0; i < linhas; i++) {
m[i] = malloc(colunas * sizeof(int));
if (!m[i]) return NULL;
}
for (int i = 0; i < linhas; i++) {
for (int j = 0; j < colunas; j++) {
printf(“Elemento[%d][%d]: “, i, j);
scanf(”%d”, &m[i][j]);
}
}
return m;
}
int **m = malloc(linhas * sizeof(int *));
if (!m) return NULL;
for (int i = 0; i < linhas; i++) {
m[i] = malloc(colunas * sizeof(int));
if (!m[i]) return NULL;
}
for (int i = 0; i < linhas; i++) {
for (int j = 0; j < colunas; j++) {
printf(“Elemento[%d][%d]: “, i, j);
scanf(”%d”, &m[i][j]);
}
}
return m;
}
int **multiplicarMatrizes(int **A, int a, int b, int **B, int c, int d) {
if (b != c) return NULL;
int **C = malloc(a * sizeof(int *));
if (!C) return NULL;
for (int i = 0; i < a; i++) {
C[i] = malloc(d * sizeof(int));
if (!C[i]) return NULL;
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < d; j++) {
C[i][j] = 0;
for (int k = 0; k < b; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
if (b != c) return NULL;
int **C = malloc(a * sizeof(int *));
if (!C) return NULL;
for (int i = 0; i < a; i++) {
C[i] = malloc(d * sizeof(int));
if (!C[i]) return NULL;
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < d; j++) {
C[i][j] = 0;
for (int k = 0; k < b; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
void imprimirMatriz(int **M, int linhas, int colunas) {
for (int i = 0; i < linhas; i++) {
for (int j = 0; j < colunas; j++) {
printf("%5d", M[i][j]);
}
printf("\n");
}
}
for (int i = 0; i < linhas; i++) {
for (int j = 0; j < colunas; j++) {
printf("%5d", M[i][j]);
}
printf("\n");
}
}
void liberarMatriz(int **M, int linhas) {
for (int i = 0; i < linhas; i++) {
free(M[i]);
}
free(M);
}
for (int i = 0; i < linhas; i++) {
free(M[i]);
}
free(M);
}
int main() {
int a, b, c, d;
printf(“Dimensoes de A (linhas colunas): “);
scanf(”%d %d”, &a, &b);
printf(“Dimensoes de B (linhas colunas): “);
scanf(”%d %d”, &c, &d);
int a, b, c, d;
printf(“Dimensoes de A (linhas colunas): “);
scanf(”%d %d”, &a, &b);
printf(“Dimensoes de B (linhas colunas): “);
scanf(”%d %d”, &c, &d);
int **A = criarLerMatriz(a, b);
int **B = criarLerMatriz(c, d);
int **C = multiplicarMatrizes(A, a, b, B, c, d);
printf("\nMatriz A:\n");
imprimirMatriz(A, a, b);
printf("\nMatriz B:\n");
imprimirMatriz(B, c, d);
if (C) {
printf("\nProduto A x B:\n");
imprimirMatriz(C, a, d);
} else {
printf("\nIncompatibilidade de dimensoes: nao eh possivel multiplicar A e B.\n");
}
liberarMatriz(A, a);
liberarMatriz(B, c);
if (C) liberarMatriz(C, a);
return 0;
}