Você está na página 1de 14

1.

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

(1) Armazenar as notas de 50 alunos.

float nota1, nota2, nota3, ..., nota50;

float notas[50]; • Matriz unidimensional  VETOR


(2) Armazenar as 4 médias de 50 alunos em uma determinada disciplina.
NOTA/
ALUNO
0 1 2 3 float notas[50][4]; • Matriz bidimensional
0 9.8 9.0 7.0 6.0
linha colunas
1 9.2 7.5 7.9 6.9

8.8 9.1 5.7 7.5 • 2º média do 4º aluno: float notas[3][1];


2
... ... ... ... ...
• 4º média do 2º aluno: float notas[1][3];
49 9.5 9.5 7.5 6.5
• 1º média do 1º aluno: float notas[0][0];
2. MATRIZ X VETOR
MATRIZ

• Estruturas que armazenam vários dados de um mesmo tipo de forma organizada


de fácil manipulação.
• Pode-se dizer que uma matriz consiste em um vetor onde cada elemento é
composto por outro vetor.
• Usada para representar uma certa quantidade de variáveis que são referenciadas
pelo mesmo nome.
• Consiste em locações contíguas de memória.
• Os dados sãoint
referenciados
v[10]; porInvasão
índices numéricos começando sempre por 0.
de memória!!

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

int v[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; /*Na declaração*/


float mat[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; /*Sequencialmente*/
float mat[][3]={1,2,3,4,5,6,7,8,9,10,11,12}; /*nº de linhas pode ser omitido*/

• PASSAGEM DE MATRIZES PARA FUNÇÕES

void f (..., float (*mat)[3], ...);


void f (..., float mat[][3], ...);

• De qualquer forma, o acesso aos elementos da matriz é feito da forma usual, com
indexação dupla.

mat [0][1]; //acessa o elemento da primeira linha e segunda coluna


4. ALOCAÇÃO DE MATRIZES
 ALOCAÇÃO DINÂMICA

• Limitação da alocação estática: precisa-se saber de antemão suas dimensões.

• A linguagem C só permite alocar dinamicamente conjuntos unidimensionais.


• A alocação dinâmica de matrizes exige uma abstração conceitual com vetores.

o MATRIZ REPRESENTADA POR UM VETOR SIMPLES

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

o MATRIZ REPRESENTADA POR UM VETOR DE PONTEIROS


• Cada linha da matriz é representada por um vetor independente.
• A matriz é então representada por um vetor de vetores, ou vetor de ponteiros,
no qual cada elemento armazena o endereço do primeiro elemento de cada linha.

int i;
float **mat; /*matriz representada por um vetor
de ponteiros */
...
mat = (float**) malloc(m*sizeof(float*));

for (i=0; i<m; i++)


mat[i] = (float*)malloc(n*sizeof(float));
• O acesso aos elementos é feito da mesma forma de uma matriz criada
estaticamente.
• mat [ i ] representa o ponteiro para o primeiro elemento da linha i
• mat [ i ] [ j ] acessa o elemento da coluna j da linha i.
4. ALOCAÇÃO DE MATRIZES
 ALOCAÇÃO DINÂMICA

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

o TRANSPOSTA DE UMA MATRIZ número de linhas matriz vetorizada

float* transposta (int m, int n, float* mat)


{
Ponteiro do número de colunas
int i, j;
vetor da matriz
transposta float* trp;
criada /* aloca matriz transposta */
trp = (float*) malloc(n*m*sizeof(float));
/* preenche matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[j*m+i] = mat[i*n+j];
return trp;
}
5. OPERAÇÃO COM MATRIZES
MATRIZ COM VETOR DE PONTEIROS

o TRANSPOSTA DE UMA MATRIZ número de linhas Matriz original


float** transposta (int m, int n, float** mat)
{
vetor de ponteiros int i, j; número de colunas
da matriz float** trp;
transposta criada /* aloca matriz */
trp = (float**) malloc(m*sizeof(float*));
for (i=0; i<m; i++)
trp[i] = (float*) malloc(n*sizeof(float));
/* preenche matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[j][i] = mat[i][j];
return trp;
}
5. OPERAÇÃO COM MATRIZES
REPRESENTAÇÃO DE MATRIZES SIMÉTRICAS

1 2 3 • Não é preciso armazenar ambos os valores


mat [ i ] [ j ] e mat [ j ] [ i ];

mat  2 4 5
• Pode-se armazenar apenas os elementos da
3 5 6 diagonal principal e os elementos abaixo (i > j)
ou acima (j > i) dela.

• Economia de memória:

 Matriz cheia  n2

Armazenamento alternativo  s  n
n 2


 n nn  1
2 2
5. OPERAÇÃO COM MATRIZES
MATRIZ COM VETOR SIMPLES

o MATRIZ SIMÉTRICA número de linhas


float* cria (int n)
{
ponteiro do int s = n*(n+1)/2;
vetor da matriz float* mat = (float*) malloc(s*sizeof(float));
criada return mat;
}

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

Você também pode gostar