Multiplicação de Matrizes com ponteiros

Publicado por Paulo Henrique 18/07/2007

[ Hits: 20.044 ]

Download multimatrizcomaloc.c




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 =)

  



Esconder código-fonte

#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;
}

Scripts recomendados

Diária Hotel

Dividir figura em .pnm em fatias

Multiplicação de 2 matrizes

Imprimir primeiras letras de uma String

CAIXA ELETRÔNICO em c++ para Linux


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts