O código a seguir apresenta a técnica de alocação dinâmica de vetor (matriz linha ou matriz coluna) na linguagem de programação C. Foi usado o Borland C-Builder 6.
O usuário poderá definir o tamanho de uma matriz bi-dimensional e em seguida fornecer os valores para cada elemento, que neste estudo de caso é do tipo inteiro.
A função "sizeof(int)" retorna o tamanho em bytes para cada elemento da matriz[m][n].
Com a função "malloc( m * n * sizeof( int ) )" são alocados bytes na memória RAM suficientes para armazenar a quantidade de elementos ( int ) que compõem a matriz[m][n]. Esta função retorna um ponteiro do tipo (void*) sendo necessária a conversão para ponteiro do tipo (int*).
Para a entrada de dados, o algoritmo percorre de maneira bi-dimensional a matriz[m][n], sendo necessária a conversão dos índices m e n para a posição efetiva no vetor:
posição no vetor = t * n + u
onde:
t : linha corrente na matriz[m][n]
u: coluna corrente na matriz[m][n]
n : quantidade de colunas por lina na matriz[m][n]
Na segunda parte do código, o algoritmo percorre linearmente o vetor de dados que armazena a matriz[m][n] desejada, e para informação é calculada de maneira inversa os índices correntemente sendo impressos:
v = t / n (divisão inteira)
w = t % n (resto de divisão inteira)
onde:
t : posição corrente no vetor
n : quantidade de colunas por linha na matriz[m][n]
v : linha corrente da matriz[m][n]
w : coluna corrente da matriz[m][n]
Antes de analisar o código, acompanhe o diagrama de blocos a seguir:
Agora temos o código na linguagem C:
//--------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------- /* Alocação dinâmica de memória Estudo de caso: matrizes e vetores equivalentes malloc, free, fflush, printf, scanf */ #include <stdio.h> #pragma argsused int m, n, c, t, u, valor; printf("Matriz A[m][n]:\n"); fflush(stdin); printf("Digite valor de m:"); printf("Digite valor de n:"); // Alocar recurso de memória RAM ---------- c = m * n; A = (int*) malloc( c * sizeof( int ) ); // ---------------------------------------- if ( A == NULL ) printf("\nDigite os elementos da matriz A[%d][%d]\n", m, n); for ( t=0; t<m; t++ ) A[ t * n + u ] = valor; } printf("\n\nMatriz A[%d][%d]:\n", m, n); for ( t=0; t<c; t++ ) printf("\n\nTecle ENTER para encerrar"); fflush(stdin); // Liberar recurso de memória RAM ----- free(A); // ------------------------------------ return 0; |
Links sugeridos para outros esclarecimentos:
http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html
http://en.wikipedia.org/wiki/Malloc
http://cplus.about.com/od/learningc/ss/pointers_7.htm
http://informatica.hsw.uol.com.br/programacao-em-c29.htm
Cópias de tela da execução do código aqui apresentado:
Para estudo, desenvolver uma aplicação para multiplicar duas matrizes bi-dimensionais:
C[m][j] = A[m][n] . B[i][j]
restrições:
- n igual a i
- m, n, i, j maiores que zero
Links com fundamentos matemáticos para multiplicação de matrizes:
- http://www.eng.uerj.br/~marcelo/matriz.html
- http://pt.wikipedia.org/wiki/Matriz_(matem%C3%A1tica)
- http://pessoal.sercomtel.com.br/matematica/medio/matrizes/matrizes.htm
- http://msdn.microsoft.com/pt-br/library/8667dchf.aspx
Bom estudo e até a próxima.