Multiplicação de Matrizes com ponteiros
Publicado por Paulo Henrique 18/07/2007
[ Hits: 20.422 ]
Depois de um tempinho dedicado pra resolver esse probleminha, resolvi postar para o caso de alguém ter o mesmo! Trata-se de um programa de multiplicação de matrizes usando alocação dinâmica.
Código livre pra todos que desejarem visualizar =)
#include <stdlib.h>
#include <stdio.h>
/* @Autor Paulo Henrique - Doidinho <contato@dicnet.com.br>
Multiplicação Matricial usando ponteiros com alocação dinamica
Agradecimentos faimison e adair =)
Apesar de ser uma função básica e fácil tive alguns probelmas quando quis fazê-la
e os dois me ajudaram nas minhas dúvidas ^^
*/
// Procedimento cardimen pra carregar as dimensões das matrizes
void cardimen(int *nl, int *nc,char texto[]) {
printf("Digite a quantidade de linhas de %s\t",texto);
scanf("%d",nl);
printf("Digite a quantidade de colunas de %s\t",texto);
scanf("%d",nc);
}
//Função carregamat como ponteiro pra pegar os valores de cada elemento da matriz quer for pedida
int *carregamat (int nl, int nc,char texto[]){
int l,c;
int *temp;
temp = (int *) calloc((nl*nc), sizeof(int));
if (temp) {
for (l=0;l<nl;l++) {
for (c=0;c<nc;c++) {
printf("Digite o elemento [%d , %d] de %s\t",l+1,c+1,texto);
scanf("%d",&temp[(l*nc)+c]);
}
}
}else{
puts("Erro na alocacao de memoria");
exit(0);
}
return temp;
}
//Função Multiplica tb como ponteiro que recebe todos os dados e multiplica os valores de cada item
int *multiplica (int *matA, int *matB, int nla, int nca, int nlb, int ncb){
int l,c,k;
int *matRes;
matRes= (int *) calloc((nla*ncb),sizeof(int));
if (matRes) {
for (l=0;l<nla;l++){
for (c=0;c<ncb;c++){
matRes[(l*ncb)+c]=0;
for (k=0;k<nca;k++) {
matRes[(l*ncb)+c]=matRes[(l*ncb)+c]+matA[(l*nca)+k]*matB[(k*ncb)+c];
}
}
}
}else{
puts("Erro na alocacao de memoria");
exit(0);
}
return(matRes);
}
//Procedimento imprimeMatriz, que recebe o valor de matRes e imprime o resultado, poderia imprimir as
//outras matrizes, basta apenas declarar elas dentro do procedimento e pedir isso no método main
void imprimeMatriz (int nl, int nc, int *matRes) {
int l, c;
for (l=0;l<nl;l++){
for (c=0;c<nc;c++) {
printf("\t %d", matRes[(l*nc)+c]);
}
printf ("\n");
}
}
//Método Main
int main(int argc, char *argv[])
{
int nla,nca,nlb,ncb;
int *matA,*matB,*matRes;
cardimen(&nla,&nca,"A");
cardimen(&nlb,&ncb,"B");
while (nla != ncb){
printf("Matrizes Incompativeis");
printf("Digite novamente a quantidade de linhas de B\n");
scanf("%d",&ncb);
}
puts("\nCarga da Matriz A");
matA=carregamat(nla,nca,"A");
puts("\nCarga da Matriz B");
matB=carregamat(nlb,ncb,"B");
matRes=multiplica(matA,matB,nla,nca,nlb,ncb);
puts("\nResuldado da multiplicacao");
imprimeMatriz(nla,ncb,matRes);
system("PAUSE");
return 0;
}
Transforma a quantidade de dias digitados em anos, meses e dias
Jogo: Acerte o número (com níveis de dificuldade)
Converte Celsius para Farenheit
Contador de palavras, linhas e caracteres de um arquivo texto
Nenhum comentário foi encontrado.
SynapSeq - programa para estimular as ondas cerebrais
Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP
Preparando-se para certificações da LPI através do LPI Lab
Migração de Arch Linux para repositórios CachyOS (Uso de Instruções v3 e v4)
As diferencas entre o clipboard comum e a selecao ativa
Arch Linux com repos do CachyOS para otimização ou usar Gentoo?
Ativando o modo Quake no XFCE4-Terminal
[Tutorial] Configurando Multimaster no Samba 4 AD (DC02) + Explicação de FSMO Roles
Instalação Dual Boot Linux+Windows 11 [RESOLVIDO] (5)
Abrir um arquivo URL pelo Clipper (3)
O que você está ouvindo agora? [2] (241)









