Aula 12 – Vetores

16 junho, 2009 (16:26) | aulas | Por: admin

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.

vetores_linhas

Executar!

No exemplo a seguir uma série de elipses são desenhadas a partir das informações do vetor.

vetores_diametro_elipse2

Executar!

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_aleatorios

Executar!

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.

vetores_aleatorios2

Executar!

A posição ou estado do mouse também podem ser armazenados utilizando-se vetores.

vetores_mouse

Executar!

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.

vetores_mouse2

Executar!

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.

vetores_mouse3

Executar!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comentários

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 [...]