Produto de duas matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 6.939 ]
Homepage: http://www.danielmoreira.wordpress.com
Faz o produto de duas matrizes alocadas dinamicamente. Os valores das matrizes são lidos de um arquivo chamado matrizes.txt, que você pode criar conforme especificado no arquivo principal.c.
O programa inclui as funções:
Matriz* cria (int m, int n); // Cria a matriz
void imprime(Matriz *A); // Imprime os elementos da matriz
Matriz* produto(Matriz *A, Matriz *B); // faz o produto das matrizes A e B
float acessa (Matriz* mat, int i, int j); // retorna um valor específico da matriz
void atribui (Matriz* mat, int i, int j, float v); // atribui um valor à uma posição específica da matriz
void libera (Matriz* mat); // libera a memória alocada
int get_nlin (Matriz* mat); // retorna número de linhas
int get_ncol (Matriz* mat); // retorna número de colunas
No programa principal temos a matriz A[m,n] e fazemos B[n,m], porque o objetivo é obter uma matriz quadrada. Mas a função produto funciona para quaisquer matrizes A[m,n] e B[p,q] desde que n=p.
//Este é somente o arquivo matriz.c
# include <stdio.h>
# include <stdlib.h>
# include "matriz.h"
struct matriz {
 int lin;
 int col;
 float** v;
};
Matriz* cria(int m, int n){
int i;
Matriz* mat=(Matriz*)malloc(sizeof(Matriz));
        if(mat==NULL){
          printf("Memoria Insuficiente!\n");
          exit(1);
        }
mat->lin=m;
mat->col=n;
        mat->v=(float**)malloc(m*sizeof(float*));
        for (i=0; i<m; i++) {
            mat->v[i]=(float*)malloc(n*sizeof(float));
        }
        
return(mat);
}
void imprime(Matriz *A){
int i, j;
    for(i=0; i<(A->lin); i++){
       for(j=0; j<(A->col); j++){
          printf("%f  ", A->v[i][j]);
       }
       printf("\n");
    }
}
Matriz* produto(Matriz *A, Matriz *B){
int i=0, j=0, a, cont;
float s=0;
Matriz *C=cria(get_nlin(A), get_ncol(B));
       for(cont=0; cont<(get_nlin(C)*get_ncol(C)); cont++){
           for(a=0; a<get_ncol(A); a++){
              s=s+(A->v[i][a]*B->v[a][j]);
           }
           C->v[i][j]=s;
           s=0;
           if( j==(get_ncol(C)-1) ){
             i++;
             j=0;
           }else{
             j++;
           }
       }
return(C);
}
float acessa (Matriz* mat, int i, int j){
      if(i<0 || i>(mat->lin) || j<0 || j>(mat->col) ){
         printf("Acesso Invalido.");
         exit(1);
      }
return(mat->v[i][j]);
}
void atribui (Matriz* mat, int i, int j, float v){
     if(i<0 || i>(mat->lin) || j<0 || j>(mat->col) ){
         printf("Acesso Invalido.");
         exit(1);
     }
mat->v[i][j]=v;
}
void libera (Matriz* mat) {
     int i;
     for(i=0; i<mat->lin; i++) {
        free(mat->v[i]);
     }
     free(mat->v);
     free(mat);
}
int get_nlin (Matriz* mat){
return(mat->lin);
}
int get_ncol (Matriz* mat){
return(mat->col);
}
Jogo da cobrinha (Snake II) refeito em C e C++
Full linux c++ implementation of conio.h (conio.h para linux)
Simulador do Sorteio da Mega Sena
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
E aí? O Warsaw já está funcionando no Debian 13? (12)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (3)









