Funções de soma e subtração de matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 13.371 ]
Homepage: http://www.danielmoreira.wordpress.com
Dada a quantidade de linha e coluna das matrizes, fazemos a alocação dinamicamente através da função "cria". O programa inclui as funções:
Matriz* cria (int m, int n); // cria a matriz através de alocação dinâmica
Matriz* ADD (Matriz* A, Matriz* B);
// Soma duas matrizes
Matriz* MINUS (Matriz* A, Matriz* B);
// Subtrai duas matrizes (mesmo conceito da função de cima)
void libera (Matriz* mat);
// Libera a memória alocada
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
int linhas (Matriz* mat);
// Retorna número de linhas
int colunas (Matriz* mat); // Retorna número de colunas
//Este é apenas o matriz.c do programa.
# 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;
}
Matriz* ADD(Matriz* A, Matriz* B){
int m, n, i, j;
float plus;
Matriz *C;
m=A->lin;
n=A->col;
C=cria(m,n);
for(i=0; i<m; i++){
for(j=0; j<n; j++){
plus=(acessa(A, i, j)) + (acessa(B, i, j));
atribui(C, i, j, plus);
}
}
return (C);
}
Matriz* MINUS (Matriz* A, Matriz* B){
int m, n, i, j;
float plus;
Matriz *C;
m=A->lin;
n=A->col;
C=cria(m,n);
for(i=0; i<m; i++){
for(j=0; j<n; j++){
plus=(acessa(A, i, j)) - (acessa(B, i, j));
atribui(C, i, j, plus);
}
}
return (C);
}
void libera (Matriz* mat) {
int i;
for(i=0; i<mat->lin; i++) {
free(mat->v[i]);
}
free(mat->v);
free(mat);
}
float acessa (Matriz* mat, int i, int j){
if (i<0 || i>=mat->lin || j<0 || j>=mat->col) {
printf("Acesso Invalido!\n");
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("Nao foi possivel atribuir o valor!\n");
exit(1);
}
mat->v[i][j]=v;
}
int linhas (Matriz* mat){
return (mat->lin);
}
int colunas (Matriz* mat){
return (mat->col);
}
Alocando espaço para uma matriz dinamicamente
Programa para cálculo de números complexos
Boletim Escolar Com Manipulação de Arquivo
Nenhum comentário foi encontrado.
LXQT - funcional para máquinas pererecas e usuários menos exigentes
Instalação do K3s Single-Node com Rancher no Ubuntu 24.04
Usei o NotebookLM para Auditar Logs do Linux
Cinnamon seria a aposta acertada frente às outras interfaces gráficas mais populares?
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Como Configurar DNS Reverso (PTR) em Ambientes Linux e Microsoft
Preparando o Ambiente para Administrar o Samba 4 a partir do Windows com RSAT
WiFi Seguro: EAP-TLS com FreeRADIUS e Active Directory (LDAP)
Midia de instalação LM-21.3 não inicializa (4)
O que você está ouvindo agora? [2] (227)
Vou destruir sua infância:) (10)









