Multiplicação de Matrizes com ponteiros
Publicado por Paulo Henrique 18/07/2007
[ Hits: 20.012 ]
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; }
Verificador de senhas: Comparando palavras
Calcular taxa de juros com constante em C
Como fazer raízes a partir de 2 e 3 no c.
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta