Você está na página 1de 36

Estruturas de Dados

Vetores e Alocao Dinmica


1 Original desenvolvido por Marco A. Casanova - PUC-Rio
2
Tpicos
Vetores
Alocao dinmica
Vetores locais e funes
Vetores
Vetor:
estrutura de dados definindo um conjunto enumervel
Exemplo:
v = vetor de inteiros com 10 elementos

int v[10];
3
Vetores
Vetor (cont.):
vetor pode ser inicializado
Exemplo:
v = vetor de inteiros com 10 elementos


int v[5] = { 5, 10, 15, 20, 25 };


ou simplesmente:


int v[] = { 5, 10, 15, 20, 25 };
4
5
Vetores
Vetor (cont.):
acesso a cada elemento feito atravs de indexao da varivel
Exemplo:
v = vetor de inteiros com 10 elementos
v[0] = 0; /* acessa o primeiro elemento de v */
...
v[9] = 9;


v[10] =10
/*


/*
acessa o ltimo elemento de v


ERRADO (invaso de memria)
*/


*/
6
Vetores
Vetor (cont):
vetor alocado em posies contguas de memria
Exemplo:
v = vetor de inteiros com 10 elementos
espao de memria de v =
10 x valores inteiros de 4 bytes =
40 bytes
v 104
144
Vetores
Vetores e ponteiros:
nome do vetor aponta para endereo inicial
C permite aritmtica de ponteiros
Exemplo:
v+0 : primeiro elemento de v
...
v+9 : ltimo elemento de v
Exemplo:
&v[i] equivalente a (v+i)
*(v+i) equivalente a v[i]
v 104
144
v+2
v+1
v+0
v+9
v+8
v+7
7
Vetores
Exemplo:
clculo da mdia e da varincia
de um conjunto de 10 nmeros reais
implementao
valores so lidos e armazenados em um vetor de 10 posies
clculos da mdia e da varincia efetuados sobre o conjunto de
valores armazenado
x m
2
8
N N
m

, v

x
/* Clculo da mdia e da varincia de 10 nmeros reais */


#include <stdio.h>
int main ( void )
{
float v[10];
float med, var;
int i;
/* declara vetor com 10 elementos */
/* variveis para a mdia e a varincia */
/* varivel usada como ndice do vetor */
/* leitura dos valores */
for (i = 0; i < 10; i++)
scanf("%f", &v[i]);
/* faz ndice variar de 0 a 9 */
/* l cada elemento do vetor (digitados na mesma linha) */
endereo da i-sima
posio de v
9
/* clculo da mdia */
med = 0.0;
for (i = 0; i < 10; i++)
med = med + v[i];
med = med / 10;
/* inicializa mdia com zero */
/* acumula soma dos elementos */
/* calcula a mdia */
/* clculo da varincia */
var = 0.0;
/* inicializa com zero */
for ( i = 0; i < 10; i++ )
var = var+(v[i]-med)*(v[i]-med); /* acumula */
var = var / 10; /* calcula a varincia */
/* exibio do resultado */
printf ( "Media = %f
return 0;
Variancia = %f \n", med, var );
}
comando no pertence
ao corpo do for
10
11
Vetores
Passagem de vetor para funo:
consiste em passar o endereo da primeira posio do vetor
funo deve ter parmetro do tipo ponteiro para armazenar valor
passar um vetor para uma funo equivalente a
passar o endereo inicial do vetor
elementos do vetor no so copiados para a funo
argumento copiado apenas o endereo do primeiro elemento
Exemplo:
chamada a funo passando vetor de int
funo deve ter um parmetro do tipo int
/* Clculo da mdia e da varincia de 10 reais (segunda verso) */


#include <stdio.h>
/* Funo para clculo da mdia */
float media (int n, float* v)
{
int i;
float s = 0.0;
for (i = 0; i < n; i++)
s += v[i];
return s/n;
}
parmetro do tipo
ponteiro para float
12
/* Funo para clculo da varincia */
float variancia (int n, float* v, float m)
{
int i;
float s = 0.0;
for (i = 0; i < n; i++)
s += (v[i] - m) * (v[i] - m);
return s/n;
}
13
int main ( void )
{
float v[10];
float med, var;
int i;

/* leitura dos valores */
for ( i = 0; i < 10; i++ )
scanf("%f", &v[i]);


med = media(10,v);
var = variancia(10,v,med);
14
printf ( "Media = %f
return 0;
Variancia = %f \n", med, var);
}
15
Vetores
Passagem de vetor para funo (cont.):
funo pode alterar os valores dos elementos do vetor pois
recebe o endereo do primeiro elemento do vetor
(e no os elementos propriamente ditos)
Exemplo:
funo incrementando todos os elementos de uma unidade
/* Incrementa elementos de um vetor */
#include <stdio.h>
void incr_vetor ( int n, int *v )
{
int i;
for (i = 0; i < n; i++)
v[i]++;
}


int main ( void )
{
int a[ ] = {1, 3, 5};
incr_vetor(3, a);
printf("%d %d %d \n", a[0], a[1], a[2]);
return 0;
}


sada do programa ser 2 4 6
16
17
Alocao Dinmica
Uso da memria:
uso de variveis globais (e estticas):
espao reservado para uma varivel global existe
enquanto o programa estiver sendo executado
uso de variveis locais:
espao existe apenas enquanto a funo que declarou a varivel
est sendo executada
liberado para outros usos quando a execuo da funo termina
variveis globais ou locais podem ser simples ou vetores:
para vetor, necessrio informar o nmero mximo de elementos
pois o compilador precisa calcular o espao a ser reservado
18
Alocao Dinmica
Uso da memria:
alocao dinmica:
espao de memria requisitada em tempo de execuo
espao permanece reservado at que seja explicitamente liberado
depois de liberado, espao estar disponibilizado para outros usos e
no pode mais ser acessado
espao alocado e no liberado explicitamente,
ser automaticamente liberado quando ao final da execuo
19
Alocao Dinmica
Uso da memria:
memria esttica:
cdigo do programa
variveis globais
variveis estticas
memria dinmica:
variveis alocadas
dinamicamente
memria livre
variveis locais
m
e
m

r
i
a

e
s
t

t
i
c
a

Cdigo do programa
Variveis globais e
Variveis estticas
m
e
m

r
i
a

d
i
n

m
i
c
a

Variveis alocadas
dinamicamente
Memria livre
Variveis locais
(Pilha de execuo)
20
Alocao Dinmica
Uso da memria:
alocao dinmica de memria:
usa a memria livre
se o espao de memria livre for
menor que o espao requisitado,
a alocao no feita e
o programa pode prever
tratamento de erro
pilha de execuo:
utilizada para alocar memria
quando ocorre chamada de funo:
sistema reserva o espao
para as variveis locais da funo
quando a funo termina,
espao liberado (desempilhado)
se a pilha tentar crescer mais do
que o espao disponvel existente,
programa abortado com erro
m
e
m

r
i
a

e
s
t

t
i
c
a

Cdigo do programa
Variveis globais e
Variveis estticas
m
e
m

r
i
a

d
i
n

m
i
c
a

Variveis alocadas
dinamicamente
Memria livre
Variveis locais
(Pilha de execuo)
21
Alocao Dinmica
Funes da biblioteca padro stdlib.h
contm uma srie de funes pr-definidas:
funes para tratar alocao dinmica de memria
constantes pr-definidas
....
22
Alocao Dinmica
Funo sizeof:
retorna o nmero de bytes ocupado por um tipo
Funo malloc:
recebe como parmetro o nmero de bytes que se deseja alocar
retorna um ponteiro genrico para o endereo inicial da rea de
memria alocada, se houver espao livre:
ponteiro genrico representado por void*
ponteiro convertido automaticamente para o tipo apropriado
ponteiro pode ser convertido explicitamente
retorna um endereo nulo, se no houver espao livre:
representado pelo smbolo NULL
Alocao Dinmica
Exemplo:
alocao dinmica de um vetor de inteiros com 10 elementos
malloc retorna o endereo da rea alocada para
armazenar valores inteiros
ponteiro de inteiro recebe endereo inicial do espao alocado


int *v;
v = (int *) malloc(10*sizeof(int));
23
Alocao Dinmica
Exemplo (cont.):
v = (int *) malloc(10*sizeof(int));
11 -- DDeeccllaarraao: int *v
Abre-se espao na pilha para
o ponteiro (varivel local)
24
40 bytes
v
2 - Comando: v = (int *) malloc (10*sizeof(int))
Reserva espao de memria da rea livre
e atribui endereo varivel
v
504
Cdigo do
Programa
Variveis
Globais e Estticas
Livre
-
Cdigo do
Programa
Variveis
Globais e Estticas
40 bytes
Livre
504
25
Alocao Dinmica
Exemplo (cont.):
v armazena endereo inicial de uma rea contnua de memria
suficiente para armazenar 10 valores inteiros
v pode ser tratado como um vetor declarado estaticamente
v aponta para o inicio da rea alocada
v[0] acessa o espao para o primeiro elemento
v[1] acessa o segundo
.... at v[9]
Alocao Dinmica
Exemplo (cont.):
tratamento de erro aps chamada a malloc
imprime mensagem de erro
aborta o programa (com a funo exit)


v = (int*) malloc(10*sizeof(int));
if (v==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}

26
Alocao Dinmica
funo free:
recebe como parmetro o ponteiro da memria a ser liberada
a funo free deve receber um endereo de memria que tenha
sido alocado dinamicamente


free (v);
27
/* Clculo da mdia e da varincia de n reais */


#include <stdio.h>
#include <stdlib.h>
...
int main ( void )
{
int i, n;
float *v;
float med, var;

/* leitura do nmero de valores */
scanf("%d", &n);
/* alocao dinmica */
v = (float*) malloc(n*sizeof(float));
if (v==NULL) {
printf("Memoria insuficiente.\n);
return 1;
}
28
/* leitura dos valores */
for (i = 0; i < n; i++)
scanf("%f", &v[i]);
med = media(n,v);
var = variancia(n,v,med);
printf("Media = %f Variancia = %f \n", med, var);
/* libera memria */
free(v);
return 0;
}
29
30
Vetores Locais a Funes
rea de memria de uma varivel local:
s existe enquanto a funo que declara a varivel
estiver sendo executada
requer cuidado quando da utilizao de vetores locais
dentro de funes
Exemplo:
produto vetorial de dois vetores u e v em 3D,
representados pelas trs componentes x, y, e z
u v u v v u ,
x y x y z x y z y z z x
u v v u , u v v u
float* prod_vetorial (float* u, float* v)
{
float p[3];
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
return p; /* ERRO: no podemos retornar endereo de rea local (p vetor) */
}



varivel p declarada localmente:
rea de memria que a varivel p ocupa deixa de ser vlida
quando a funo prod_vetorial termina
funo que chama prod_vetorial no pode acessar a rea apontada
pelo valor retornado
31
Vetores Locais a Funes
float* prod_vetorial (float* u, float* v)
{
float *p = (float*) malloc(3*sizeof(float));
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
return p;
}
varivel p alocada dinamicamente
rea de memria que a varivel p ocupa permanece vlida mesmo aps o
trmino da funo prod_vetorial
funo que chama prod_vetorial pode acessar o ponteiro retornado
problema - alocao dinmica para cada chamada da funo:
ineficiente do ponto de vista computacional
requer que a funo que chama seja responsvel pela liberao do espao
32
Vetores Locais a Funes
void prod_vetorial (float* u, float* v, float* p)
{
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
}

espao de memria para o resultado
passado pela funo que chama:
funo prod_vetorial recebe trs vetores,
dois vetores com dados de entrada
um vetor para armazenar o resultado
soluo mais adequada pois no envolve alocao dinmica
33
Vetores Locais a Funes
Resumo
Vetor:
34
alocao de vetor: tipo nome[ #elementos];
acesso a cada elemento: atravs de indexao da varivel
nome do vetor: aponta para endereo inicial
Funes para gerncia de memria:
sizeof retorna o nmero de bytes ocupado por um tipo
malloc recebe o nmero de bytes que se deseja alocar
retorna um ponteiro para o endereo inicial, ou
retorna um endereo nulo (NULL)
free recebe o ponteiro da memria a ser liberada
Exerccios
Crie um programa em C que pea 10 nmeros, armazene eles em um
vetor e diga qual elemento o maior, e seu valor.
Crie um programa em C que pea 10 nmeros, armazene eles em um
vetor e diga qual elemento o maior, qual o menor e que seus
valores.
Crie um aplicativo em C que pea um nmero inicial ao usurio, uma
razo e calcule os termos de uma P.A (Progresso Aritmtica),
armazenando esses valores em um vetor de tamanho 10.
Crie um aplicativo em C que pea um nmero inicial ao usurio, uma
razo e calcule os termos de uma P.G (Progresso Geomtrica),
armazenando esses valores em um vetor de tamanho 10.
Escreva um programa que sorteio, aleatoriamente, 10 nmeros e
armazene estes em um vetor. Em seguida, o usurio digita um nmero
e seu programa em C deve acusar se o nmero digitado est no vetor
ou no. Se estiver, diga a posio que est.
3
6
Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel,
Introduo a Estruturas de Dados, Editora Campus
(2004)
Captulo 5 Vetores e alocao dinmica