Aula 12 – Vetores
Objetivo
As variáveis criadas até agora permitiram o armazenamento de apenas um valor de cada vez. Vetores permitem a definição de variáveis com o poder de armazenar múltiplos valores. Voltando à metáfora das gavetas, um vetor corresponde a uma gaveta com inúmeras subdivisões.
O objetivo deste capítulo é definir como podemos utilizar vetores em nossos programas e descreve inúmeras situações nas quais os vetores são essenciais.
Sintaxe introduzida
- Funções de manipulação de vetor:
- append: Aumenta um vetor em um elemento colocando um novo elemento no fim do vetor;
- arrayCopy: Copia um vetor ou parte deve em outro;
- concat: Concatena (junta) dois vetores;
- expand: Aumenta um vetor para o dobro de seu tamanho ou para um tamanho especificado;
- reverse: Inverte um vetor;
- shorten: Elimina o último elemento de um vetor;
- sort: Ordena um vetor;
- splice: Coloca um vetor ou elemento dentro de um outro;
- subset: Retorna um vetor de elementos de dentro de um vetor já existente.
Declarando e criando vetores
Variáveis do tipo vetor podem ser declaradas da mesma maneira que se declara qualquer outro tipo de dado. A diferença é que após o nome do tipo de dado, deve-se colocar um sinal de abertura e de fechamento de colchetes ([ e ]).
Dessa forma, os seguintes códigos declaram vetores:
int[] posicao;
float[] tamanho;
color[] cor;
string[] nome;
Depois da declaração de uma variável como vetor, ele não pode ser utilizado ainda. É necessária a criação do vetor informando quantas posições ele disponibiliza para uso. Neste momento, parte da memória do computador é separada para cada posição do vetor. A palavra chave new é usada neste processo.
No código abaixo, por exemplo, o vetor posição é criado com 5 posições:
int[] posicao;
posicao = new int[5];
Também é possível declarar e criar um vetor em uma mesma linha. No exemplo abaixo, é criado um vetor cor com 10 posições.
color[] cor = new color[10];
Após o processo de criação de um vetor na memória cada uma de suas posições está vazia pode ter um valor indefinido ou um valor padrão. Visualmente pode-se representar cada uma das posições como se fosse uma variável independente.
Por exemplo, após a execução do código a seguir, a representação na memória do computador é a de 4 variáveis independentes nomeadas: tam[0], tam[1], tam[2], tam[3]. No Processing os vetores iniciam-se na posição zero.
Atribuição de valores a uma posição de um vetor
Para colocar um valor dentro de uma variável de vetor, ou seja, preencher cada posição com uma atribuição pode-se utilizar o nome do vetor e a posição desejada entre colchetes (”[" e "]“) seguida pelo sinal de recebe (”=”).
Por exemplo:
int[] dado = new int[3];
dado[0] = 5;
dado[1] = 3;
dado[2] = 2;
Outra possibilidade é substituir a criação do vetor com o operador new por uma lista separada por vírgulas e delimitada por chaves:
int[] dado = {3, 1, 2};
Limites de um vetor
Já que um vetor começa na posição zero, a tentativa de acessá-lo fora desta posição levanta um erro de execução. Este erro é bastante comum para o programador iniciante.
Por exemplo, a execução do código abaixo, pára o programa e exibe o erro ArrayIndexOutOfBoundsException.
int[] val = new int[2];
val[0] = 1; // Tudo ok
val[1] = 2; // Tudo ok
val[2] = 3; // ERRO!
Para obter o tamanho de um vetor a qualquer momento pode-se utilizar a propriedade length, acessível através do operador ponto (”.”).
O fragmento demonstra o uso desta propriedade:
int[] x = {10, 20, 30};
int[] y = {30, 40, 50,60};
int[] z = new int[5];
int[] w;
println(x.length); // Exibe 3
println(y.length); // Exibe 4
println(z.length); // Exibe 5
// Se a linha a seguir for descomentada, um erro é levantado
// println(w.length);
Percorrendo vetores
Geralmente a estrutura for é utilizada para percorrer vetores. A inicialização se dá com o valor zero, o limite é até o tamanho do vetor e a iteração é feita item a item.
Vale, portanto, o esquema:
for(int variavel = 0; variavel < vetor.length; variavel++)
{
…vetor[variavel]…
}
Observe que o atalho “variavel++” tem o mesmo resultado que variavel=variavel+1, ou seja, a cada iteração, uma posição diferente do vetor é acessada.
Abaixo, uma sequencia de linhas é desenhada com o vetor estabelecendo sua posição inicial.
No exemplo a seguir uma série de elipses são desenhadas a partir das informações do vetor.
Os dados de um vetor também podem ser alterados com a utilização da estrutura for. Esta estratégia é útil para o armazenamento do resultado da execução de cálculos.
No exemplo abaixo, o vetor d é calculado ao carregar o programa no método setup e é utilizado apenas no método draw.
Vetores também podem ser úteis para armazenar valores que representam a posição de objetos. O programa seguinte demonstra os objetos tendo sua posição alterada a partir da posição do mouse.
A posição ou estado do mouse também podem ser armazenados utilizando-se vetores.
Funções para manipulação de vetores
A manipulação de vetores com o objetivo de aumentar, diminuir, ordenar e apagar um vetor pode ser feita diretamente através de estruturas de repetição e atribuições. Esta abordagem, porém, é trabalhosa e propensa a erros. Sugere-se, portanto, o uso das funções de manipulação de vetores disponibilizadas pela biblioteca padrão. As funções do Processing são listadas a seguir:
- append: Aumenta um vetor em um elemento colocando um novo elemento no fim do vetor;
- arrayCopy: Copia um vetor ou parte deve em outro;
- concat: Concatena (junta) dois vetores;
- expand: Aumenta um vetor para o dobro de seu tamanho ou para um tamanho especificado;
- reverse: Inverte um vetor;
- shorten: Elimina o último elemento de um vetor;
- sort: Ordena um vetor;
- splice: Coloca um vetor ou elemento dentro de um outro;
- subset: Retorna um vetor de elementos de dentro de um vetor já existente.
Função append: Aumentar um vetor em um elemento
int[] x = { 1, 2, 3};
println(x); // Exibe 1, 2, 3
x = append(x, 4);
println(x); // Exibe 1, 2, 3, 4
Função arrayCopy: Copiar um vetor em outro
int[] x = {1, 2, 0, 0, 5};
int[] y = {3, 4};
arrayCopy(y, 0, x, 2, 2);
println(x); // Exibe 1, 2, 3, 4, 5
Função concat: Concatenar vetores
int[] x = {1, 2, 3};
int[] y = {4, 5, 6};
int[] z;
z = concat(x,y);
println(z);
Função expand: Aumentar um vetor
int[] x = {1, 2, 3};
// Descomentar essa linha para exibir erro!
// println(x[3]);
println(x.length); // Exibe 1, 2, 3
x = expand(x, 4);
println(x[3]);
Função reverse: Inverter um vetor
int[] x = {1, 2, 3, 4, 5, 6};
println(x); // Exibe 1, 2, 3, 4, 5, 6
x = reverse(x);
println(x); // Exibe 6, 5, 4, 3, 2, 1
Função shorten: Eliminar o último elemento
int[] x = {1, 2, 3, 4, 5};
println(x); // Exibe 1, 2, 3, 4, 5
x = shorten(x);
println(x); // Exibe 1, 2, 3, 4
Função sort: Ordenar um vetor
int[] x = {5, 4, 1, 3, 2};
println(x); // Exibe 5, 4, 1, 3, 2
x = sort(x);
println(x); // Exibe 1, 2, 3, 4, 5
Função splice: Colocar vetor dentro de outro
int[] x = {1, 2, 5};
int[] y = {3, 4};
int[] z;
z = splice(x, y, 2);
println(z); // Exibe 1, 2, 3, 4, 5
Função subset: Retorna um vetor de elementos de dentro de um vetor já existente
int[] x = {1, 2, 3, 4, 5, 6};
int[] y = subset(x, 2, 3);
println(y); // Exibe 3, 4, 5
Exemplos de uso das funções de manipulação de vetores
A função append pode ser usada para armazenar a posição do mouse. No programa abaixo, o fragmento x = append(x, mouseX) vai armazenando no fim do vetor a posição em x do mouse.
Em mais um exemplo, o vetor armazena as posições do mouse e, a cada iteração a instrução x = subset(x, 1); elimina o primeiro elemento do vetor. Desta forma, o elemento que na iteração anterior estava na posição 2, na seguinte vai para a 1 e assim sucessivamente.
Esta estratégia implementa uma trilha atrás do cursor.







Pingback de Introdução à Programação 1 e 2 (2009) » Exercício de Revisão para Prova (2o Bimestre)
Data: 23 de junho de 2009 Hora: 17:41
[...] Ver Aula 12 [...]