Escolar Documentos
Profissional Documentos
Cultura Documentos
ROTEIRO
INTRODUÇÃO
MATRIZES X VETORES
ALOCAÇÃO DE VETORES
ALOCAÇÃO ESTÁTICA
ALOCAÇÃO DINÂMICA
ALOCAÇÃO DE MATRIZES
ALOCAÇÃO ESTÁTICA
ALOCAÇÃO DINÂMICA
MATRIZ COM VETOR SIMPLES
MATRIZ COM VETOR DE PONTEIROS
OPERAÇÃO COM MATRIZES
MATRIZES TRANSPOSTAS
MATRIZES SIMÉTRICAS
1. INTRODUÇÃO
PROBLEMAS
for(i=0;i<=10;i++){
CUIDADO: o elemento nota[2] não é o 2º, e sim o 3º elemento. O último elemento
printf(“Digite um número:”);
scanf(“%d”,&v[i]);
da matriz é referenciado pela quantidade de elementos menos 1.
}
ALGUM ERRO?
3. ALOCAÇÃO DE VETORES
ALOCAÇÃO ESTÁTICA
int v[10]; int n=10;
int v[n];
• A variável que representa o vetor é uma constante que armazena o
endereço ocupado pelo primeiro elemento do vetor.
• Esses vetores podem ser declarados como variáveis globais ou dentro
do corpo de uma função.
• Problema da declaração estática é necessário saber de antemão a
dimensão máxima do vetor.
ALOCAÇÃO DINÂMICA
int* v;
…
v=(int*)malloc(n*sizeof(int)); /*Permite alocar o vetor durante a execução*/
…
v=(int*)realloc(v,m*sizeof(int)); /*Realoca o vetor durante a execução*/
4. ALOCAÇÃO DE MATRIZES
ALOCAÇÃO ESTÁTICA
int v[4][3]; /*Alocação estática de uma matriz com 4 linhas e 3 colunas*/
Essa declaração cria um vetor A cujos elementos v[0], v[1] ,v[2] e v[3] são vetores
contendo cada um deles 3 elementos do tipo int.
• É reservado um espaço de memória necessário para armazenar os 12
elementos da matriz;
• Elementos armazenados de maneira contínua, organizados linha a linha.
4. ALOCAÇÃO DE MATRIZES
ALOCAÇÃO ESTÁTICA
• INICIALIZAÇÃO
• De qualquer forma, o acesso aos elementos da matriz é feito da forma usual, com
indexação dupla.
mat[i][j] = v[i*n+j]
n = número de colunas
float *mat;
...
mat=(float*)malloc(m*n*sizeof(float
));
4. ALOCAÇÃO DE MATRIZES
ALOCAÇÃO DINÂMICA
int i;
float **mat; /*matriz representada por um vetor
de ponteiros */
...
mat = (float**) malloc(m*sizeof(float*));
o LIBERAÇÃO DE MEMÓRIA
• Libera-se cada linha antes de liberar o vetor de ponteiros.
int i;
...
for (i=0; i<m; i++)
free(mat[i]); //Libera a linha
free(mat); //Libera o vetor de ponteiros
5. OPERAÇÃO COM MATRIZES
MATRIZ COM VETOR SIMPLES
• Economia de memória:
Matriz cheia n2
Armazenamento alternativo s n
n 2
n nn 1
2 2
5. OPERAÇÃO COM MATRIZES
MATRIZ COM VETOR SIMPLES
o ACESSO
float acessa (int n, float* mat, int i, int j)
{
int k; /* índice do elemento no vetor */
if (i<0 || i>=n || j<0 || j>=n) {
printf("Acesso inválido!\n”);
exit(1);
}
if (i>=j) Considerando o
k = i*(i+1)/2 + j; armazenamento dos
else elementos abaixo da
k = j*(j+1)/2 + i; diagonal.
return mat[k];
}
5. OPERAÇÃO COM MATRIZES
MATRIZ COM VETOR DE PONTEIROS
Considerando o
o MATRIZ SIMÉTRICA armazenamento dos
float** cria (int n) elementos abaixo da
{ diagonal.
int i;
float* mat = (float**) malloc(n*sizeof(float*));
for (i=0; i<n; i++)
mat[i] = (float*) malloc((i+1)*sizeof(float));
return mat;
}
o ACESSO
float acessa (int n, float* mat, int i, int j)
{
if (i<0 || i>=n || j<0 || j>=n) {
printf("Acesso inválido!\n”);
exit(1);
}
if (i>=j)
return mat[i][j];
else
return mat[j][i];
}