Escolar Documentos
Profissional Documentos
Cultura Documentos
1
Tipos de Dados Compostos
Variveis Indexadas e
Alocao Dinmica
Prof. Thiago Oliveira dos Santos
Departamento de Informtica
Universidade Federal do Esprito Santo
12/11/2013
Aula Programao Bsica de
Computadores (INF 09325)
Informtica
2
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
3
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
4
Introduo
Variveis
Variveis so abstraes que facilitam acesso a memria
So representadas por um smbolo
Limitaes das Variveis Comuns
No permitem armazenar vrios valores de mesmo tipo
Exemplo de problemas desse tipo
Armazenar idade de um grupo de pessoas
Soluo
Usar variveis indexadas
Informtica
5
Introduo
Variveis Indexadas
Possuem um mesmo nome
So variveis que so diferenciadas atravs de um ndice
Podem possuir mais de uma dimenso
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matriz)
Variveis indexadas multidimensionais
Essa tipo de varivel pode ser alocada de duas formas
Esttica
Dinmica
Informtica
6
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
7
Variveis Indexadas Unidimensionais (Vetores)
Nome
Segue a mesma regra das variveis comuns
Declarao
Deve ser feita antes do uso (geralmente no incio do bloco)
Sintaxe
<tipo> <nome>[<tamanho>];
<tipo> = tipo de dados vlido
<nome> = nomes da varivel
<tamanho> = tamanho do vetor
Exemplo
float velocidades[10]; int idades[30], char nome[10];
Informtica
8
Variveis Indexadas Unidimensionais (Vetores)
Acesso aos Dados
Utiliza-se o operador []
ndices vo de 0 a n-1
Exemplo 1
int idadeTemp = idades[0];
float velocidadeTemp = velocidades[9];
Informtica
9
Variveis Indexadas Unidimensionais (Vetores)
Acesso aos Dados
Exemplo
int n[3];
printf("Digite um num\n");
scanf("%d", &n[0]);
printf("Digite um num\n");
scanf("%d", &n[1]);
printf("Digite um num\n");
scanf("%d", &n[2]);
printf("num1 = %d\n", n[0]);
printf("num2 = %d\n", n[1]);
printf("num3 = %d\n", n[2]);
Informtica
10
Variveis Indexadas Unidimensionais (Vetores)
Acesso Iterativo
Possibilita percorrer uma seqncia de variveis
Exemplo
int i, numeros[3];
printf("Informe 3 nmeros inteiros:\n");
for (i = 0; i < 3; i++)
scanf("%d", &numeros[i]);
printf("Ordem inversa:\n");
for (i = 2; i >= 0; i--) {
printf("%d\n", numeros[i]);
}
Informtica
11
Variveis Indexadas Unidimensionais (Vetores)
Organizao em Memria
33
int Idades[3]
Idades[0]
20 Idades[1]
50 Idades[2]
80 IdadesTemp int IdadesTemp
Informtica
12
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
13
Variveis Indexadas Bidimensionais (Matriz)
Declarao
Sintaxe
<tipo> <nome>[<tamanho_n>] [<tamanho_m>];
<tipo> = tipo de dados vlido
<nome> = nomes da varivel
<tamanho_n> = nmero de linhas
<tamanho_m> = nmero de colunas
Exemplo
float matriz[10][10]; int imagem[30][30];
Informtica
14
Variveis Indexadas Bidimensionais (Matriz)
Acesso aos Dados
Utiliza-se o operador [] duas vezes
ndices vo de 0 a n-1
Exemplo
float idadeTemp = matriz[0][0];
int pixel = imagem[29][29];
Informtica
15
Variveis Indexadas Bidimensionais (Matriz)
Acesso Iterativo
Exemplo
int i, j, matriz[2][2];
printf("Informe 4 nmeros inteiros:\n");
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
scanf("%d", &matriz[i][j]);
printf("Matriz:\n");
for (i = 0; i < 2; i++) {
printf("\t");
for (j = 0; j < 2; j++) {
printf("%d ", matriz[i][j]);
}
printf("\n");
}
Informtica
16
Variveis Indexadas Unidimensionais (Vetores)
Organizao em Memria
31
int matriz[2][2]
matriz[0][0]
23
233
43
matriz[0][1]
matriz[1][0]
matriz[1][1]
31 23
233 43
0
0
1
1
80 item int item
Informtica
17
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
18
Variveis Indexadas Multidimensionais
Caractersticas
Equivalente a bidimensional
Inclui [] adicionais na declarao e no acesso a dados
Exemplo
float matriz3D[10][10][10]; int multiDim[30][20][10][10];
Informtica
19
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
20
Inicializao de Variveis Indexadas
Variveis
int a = 1; float b = 2.0;
Variveis Indexadas
Conceito similar
Porm, requer o uso de {}
Exemplo
float velocidades[3] = { 100.0, 80.0, 50.0 };
int matriz[2][2] = { 1, 2, 3, 4 };
char umNome[10] = { 'J', 'o', 'a', 'o', '\0' };
char outroNome[10] = "Joao";
char vetorStrings[3][10] = { "Joao", "Maria", "Jose" };
Informtica
21
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
22
Alocao Dinmica
Variveis Indexadas Estticas
Ao declarar uma varivel indexada
feita uma alocao de memria do tamanho declarado
A alocao definida durante a compilao
Alocao esttica
Problema
Existem situaes que no se sabe o tamanho a ser alocado
Essa informao s obtida durante a execuo do programa
Soluo
Alocao dinmica
Informtica
23
Alocao Dinmica
Variveis Indexadas com Ponteiros
int vetor[4]
31 vetor [0] *(vetor+0)
23
233
43
vetor [1] *(vetor+1)
vetor[2] *(vetor+2)
vetor[3] *(vetor+3)
vetor
Int*
Int
Int
Int
Int
Informtica
24
Alocao Dinmica
Variveis Indexadas com Ponteiros
Identificador da varivel do tipo ponteiro
Exemplo
int i;
float vetor[6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
float *ponteiro = vetor;
for (i = 0; i < 6; i++) {
printf("%.1f\n", *ponteiro);
ponteiro++;
}
Informtica
25
Alocao Dinmica
Variveis Indexadas com Ponteiros
O operador de acesso [idx] equivalente
Ao apontado pelo endereo do identificador mais idx
int i;
float vetor[6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
float *ponteiro = &vetor[0];
for (i = 0; i < 6; i++)
printf("%.1f\n", ponteiro[i] );
printf("\n");
for (i = 0; i < 6; i++)
printf("%.1f\n", *(vetor+i) );
Informtica
26
Alocao Dinmica
Alocao de Memria Dinmica
Requer ajuda de funes adicionais
Requer manuseio de ponteiros
Funes
void* malloc (size_t size); da biblioteca #include <stdlib.h>
Aloca uma quantidade de memria definida por size
Retorna um ponteiro para a memria alocada (void*)
O retorno deve ser convertido para o tipo desejado
O tamanho da memria pode ser calculado com o operador sizeof
sizeof retorna o tamanho de um determinado tipo
Tamanho a ser alocado a igual a sizeof(tipo)*qtd_de_itens
qtd_de_itens o nmero de itens do vetor
Informtica
27
Alocao Dinmica
Alocao de Memria Dinmica
Exemplo
int i, qtd, *numeros;
printf("Quantos nmeros deseja informar? ");
scanf("%d", &qtd);
numeros = (int *)malloc(qtd * sizeof(int));
printf("Informe %d nmeros inteiros:\n", qtd);
for (i = 0; i < qtd; i++)
scanf("%d", &numeros[i]);
printf("Dobro dos nmeros informados em ordem inversa:\n");
for (i = qtd - 1; i >= 0; i--) {
numeros[i] = numeros[i] * 2;
printf("%d\n", numeros[i]);
}
Informtica
28
Alocao Dinmica
Desalocao de Memria Dinmica
Memria alocada dinamicamente
Deve ser desalocada manulamente se no for mais usada
Funo
void free (void* ptr); da biblioteca #include <stdlib.h>
Exemplo
Acrescentar a linha abaixo ao final do exemplo anterior
free(numeros);
Informtica
29
Alocao Dinmica
Desalocao de Memria Dinmica
Reusar o ponteiro de memria dinmica sem desaloca-la
Pode causar vazamento de memria
Exemplo
CUIDADO!
void leImprimeInverte(){
int i, qtd, *numeros;
printf("Quantos nmeros deseja informar? ");
scanf("%d", &qtd);
numeros = (int *)malloc(qtd * sizeof(int));
printf("Informe %d nmeros inteiros:\n", qtd);
for (i = 0; i < qtd; i++)
scanf("%d", &numeros[i]);
printf("Dobro dos nmeros informados em ordem inversa:\n");
for (i = qtd - 1; i >= 0; i--) {
numeros[i] = numeros[i] * 2;
printf("%d\n", numeros[i]);
}
//free(numeros); //sem essa linha ocorre vazamento
}
int main(int argc, char * argv[])
{
leImprimeInverte();
leImprimeInverte();
leImprimeInverte();
return 0;
}
Informtica
30
Viso Geral da Aula
Introduo
Variveis indexadas unidimensionais (Vetores)
Variveis indexadas bidimensionais (Matrizes)
Variveis indexadas multidimensionais
Inicializao de variveis indexadas
Alocao dinmica
Variveis indexadas como argumento de funo
Informtica
31
Variveis Indexadas como Argumento de Funo
Unidimensional
Vetores podem ser passados como argumento para funo
Existem 3 formas
Exemplo para um vetor int vetor[10];
void func(int* vet);
void func(int vet[]);
void func(int vet[10]);
CUIDADO! VETOR NO ALOCADO
Informtica
32
Variveis Indexadas como Argumento de Funo
Bidimensional e Multidimensional
Existe duas formas
Exemplo para um vetor int vetor[10][10];
void func(int vet[10][10]);
void func(int vet[][10]);
Exemplo para um vetor int vetor[10][10][20];
void func(int vet[10][10][20]);
void func(int vet[][10][20]);
Informtica
33
Pergunta???
Informtica
34
Exerccios
1) Elabore um algoritmo para realizar a soma de dois vetores,
A e B, de nmeros reais e de tamanho 5 e armazenar em um
vetor C.
2) Estenda o algoritmo anterior para realizar a soma de duas
matrizes, A e B, de nmeros reais e de dimenso 3 x 5.
3) Reescreva o exerccio 1 utilizando alocao dinmica de
vetores, ou seja: pergunte ao usurio o tamanho dos vetores,
em seguida leia A e B. Ao final, imprima C.
4) Reescreva o exerccio 1 utilizando funo. A funo deve ter
o seguinte cabealho: void SomaVet(float* A, float* B , float*
C, int tamanhoVet);