CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 1
Visual Basic
VI - Arrays
João Manuel R. S. Tavares
CFAC – Concepção e Fabrico Assistidos por Computador
Sumário
1) Arrays no Visual Basic1) Arrays no Visual Basic• arrays unidimensionais (vectores);
• arrays de controlos;
• arrays bidimensionais (tabelas/matrizes);
• arrays dinâmicos.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 2
2) Pesquisa;
3) Ordenamento.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 2
Array versus Variáveis Simples
U iá l i l é tili d d• Uma variável simples é utilizada para guardar um único valor;
• Uma variável do tipo array é utilizada para representar vários valores do mesmo tipo
tili d iá l
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 3
utilizando-se apenas um nome para a variável.
Imagine-se que pretende-se guardar os nomes de 1000 alunos; é razoável utilizar 1000 variáveis independentes?
Elementos de um Array
• Nome do Array: Um nome de variável válidoNome do Array: Um nome de variável válido para a estrutura.
• Índice : Um valor que identifica um elemento particular do array.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 4
• Elemento: Um item particular do array (identificado pelo seu índice).
Os elementos de um array ocupam localizações seguidas na memória principal.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 3
Declaração de um Array
Si t• Sintaxe:
Dim nomeDoArray ( m To n) As TipoDeElementos
Para nomear o array deve-se utilizar as mesmas regras utilizadas para as variáveis simples.
Exemplos:
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 5
Exemplos:
Dim month ( 1 To 12) As String
Dim score (1 To 30) As Single
Dim students (1 To 30 ) As String(Geralmente m é igual a 1.)
A Declaração Dim
Utili d d it d d fi i• Utilizada quando se necessita de definir um array.
• A declaração Dim prepara a locação de memória para o array.
• A declaração Dim deve ocorrer antes da primeira referência aos elementos do array
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 6
referência aos elementos do array.
Tal como as variáveis simples, os arrays podem ser declarados ao nível de formulário ou passados para diferentes subprogramas através dos argumentos.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 4
Exemplo: Inicialização de um Array
Private Sub cmdWhoWon Click()Private Sub cmdWhoWon_Click()Dim teamName( 1To 5) As StringDim n As Integer' Fill array with World Series WinnersteamName(1) = "Red Sox"teamName(2) = "Giants"teamName(3) = "White Sox"teamName(4) = "Cubs"
declaração
inicialização
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 7
teamName(4) = CubsteamName(5) = "Cubs"n = Val(txtNumber.Text)picWinner.Print "The "; teamName(n); " won World Series number"; n
End Sub
acesso
Array teamName()
Nome do Array
teamName( 1 To 5) As String
Red Sox Giants White Sox Cubs Cubs
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 8
teamName(1)
Índice
Localizações sucessivas na memória
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 5
Exemplo: Inicialização de um Array através da
Leitura a partir de um Ficheiro
Dim student ( 1 To 30) As StringDim student ( 1 To 30) As String
Open “STUDENTS.TXT” For Input As #1
For count = 1 To 30
Input #1, student ( count )
Next count
atribuição
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 9
Exemplo: Somar os Valores de um Array
Dim score( 1 To 30) As Single student (1 To 30) As StringDim score( 1 To 30) As Single, student (1 To 30) As String
Open “STUDENT.TXT” For Input As #1
For count = 1 To 30
Input #1, student (count), score (count)
Next count
sum = 0
For count = 1 To 30
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 10
sum = sum + score(count)
Next count
average = sum/30 Igual à média.
Soma
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 6
Arrays Paralelos
• Dois arra s di em se paralelos se os se s elementos• Dois arrays dizem-se paralelos se os seus elementos identificados pelo mesmo índice estão relacionados.
Exemplo:
Dim nom ( 1 To 8) As String , score ( 1 To 8 ) As IntegerOpen “SCORE.TXT” For Input As #1
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 11
For student = 1 To 8Input #1, nom(student), score(student)
Next studentClose #1
(Cada elemento dos arraysnom e score identificados pelo mesmo índice referem-se ao mesmo aluno.)
Ordenamento de um Array
U di d d l• Um array diz-se ordenado se os seus valores estão segundo uma ordem ascendente ou descendente.
• Para arrays com elementos do tipo string a t b l ANSI é tili d ifi
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 12
tabela ANSI é utilizada para verificar a condição “menor do que ou igual a”.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 7
Processando Arrays
• Uma pesq isa s cessi a dos elementos de m arra é• Uma pesquisa sucessiva dos elementos de um array é designada por Pesquisa Sequencial.
• Também é designada por pesquisa linear ou pesquisa em série.
• Uma Pesquisa Sequencial examina cada elemento a
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 13
• Uma Pesquisa Sequencial examina cada elemento, a partir do primeiro até ao último, até ao valor especificado ser encontrado ou até atingir o último elemento do array.
Exemplo de uma Pesquisa Sequencial (encontrar valores superiores a 8)
Dim q i ( 1 To 15) As SingleDim quiz ( 1 To 15) As Single
For position =1 TO 15
If quiz(position) > 8 THEN
picOutput.Print quiz (position)
count = count + 1
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 14
End If
Next Position
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 8
Pesquisa Sequencial
Útil li t ( t )• Útil com listas (vectores) pequenas;
• Muito ineficiente para listas longas (por exemplo nomes numa lista telefónica);
• Utilizar pesquisa binária se a lista está
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 15
Utilizar pesquisa binária se a lista está ordenada.
Pesquisa Binária
N i bi á i i t• Numa pesquisa binária, um array previamente ordenado é repetidamente devido ao meio. A parte não contendo o valor desejado é ignorada e a pesquisa continua na outra parte.
P tili i bi á i d d
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 16
• Para utilizar-se pesquisa binária, os dados devem estar no array ordenados de forma ascendente ou descendente.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 9
Exemplo de Pesquisa Binária
Private Sub BinarySearch(corp As String, result As StringfoundFlag = 0 '1 indica que o valor pretendido foi encontradofirst = 1last = numFirms
Do While (first <= last) And (foundFlag = 0)middle = Int((first + last) / 2)Select Case UCase(firm(middle))
Case corpfoundFlag = 1
Case Is > corp(O ciclo é repetido enquanto o
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 17
Case Is > corplast = middle - 1
Case Is < corpfirst = middle + 1
End SelectLoop
End Sub
( p qdado pretendido não for encontrado e ainda não for atingido o último elemento do vector.)
Exemplo de Pesquisa Binária (Cont.)
If foundFlag = 1 ThenIf foundFlag = 1 Then
result = "found”
Else
result = "not found
End If
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 18
Utilização de uma variável (Flag) para indicar que o valor desejado foi encontrado.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 10
Combinar Arrays
U áti l d é• Uma prática comum envolvendo arrays é combinar (juntar) dois arrays ordenados.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 19
Método para Combinar dois Arrays Ordenados:
1. Comparar os primeiros elementos de cada um dos arrays de p p yentrada.
A. Se um dos valores procede o outro, copia-lo para o terceiro array (o de saída/resultado) e passar a considerar o elemento seguinte do array que o continha.
B. Se os valores são iguais, copiar o valor para o terceiro array e passar a considerar os elementos seguintes de cada arra de entrada
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 20
cada array de entrada.2. Repetir o passo 1 com os novos valores dos arrays de entrada
até atingir-se o final de um dos arrays de entrada.3. Copiar os restantes valores do array ainda com elementos a
considerar para o terceiro array.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 11
Passar um Array
• Um array pode ser passado para um outro y p p pprocedimento por referência.
Exemplo:
Private Sub cmddisplay_Click()' Passagem de um array para um subrotina e uma funcaoDim score(1 To 5) As Integer Declaração do array score
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 21
Dim score(1 To 5) As IntegerCall FillArray(score( ) )picAverage.ClspicAverage.Print ”Average is"; Sum(score( ) ) / 5
End Sub
Passagens do array score
Declaração do array score
Passagem do Array Score para uma Subrotina
Private Sub FillArray(s( ) As Integer)Private Sub FillArray(s( ) As Integer)
' Preencher o array
s(1) = 85
s(2) = 92
s(3) = 75 Este array esta apontado para a mesma localização de memoria do
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 22
s(4) = 68
s(5) = 84
End Sub
çarray score.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 12
Passagem do Array Score para uma Função
Private Function Sum(s ( ) As Integer) As IntegerPrivate Function Sum(s ( ) As Integer) As Integer
Dim total As Integer, index As Integer
' determina a soma dos valores do array
total = 0
For index = 1 To 5
total = total + s(index)
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 23
total total s(index)
Next index
Sum = total
End Function
(As funções LBound(nome-do-array) e UBound(nome-do-array) permitem determinar os limites de um array.)
Array de controlos
• Uma maneira para construir arrays de caixas de texto, etiquetas e botões de comando, num formulário.
• Pelo menos um elemento de um array de controlos deve ser criado quando o formulário é desenhado.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 24
• Os elementos restantes do array tanto podem ser criados durante o desenho do formulário ou durante a execução do programa através da declaração Load.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 13
Criar um Array de Controlos durante o Desenho de um Formulário
1) Adicionar uma instancia do controlo desejado ao1) Adicionar uma instancia do controlo desejado ao formulário;
2) Definir para a propriedade Índice (Index) um número (geralmente o 0);
3) Definir todas as propriedades que serão comuns a t d t t l t
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 25
todos os restantes elementos;
4) Seleccionar o controlo e carregar em CTRL + C;
5) Para criar cada elemento carregar em CTRL + V.
Array de Controlos
• Todas as propriedades do primeiro elemento são• Todas as propriedades do primeiro elemento são passadas para os restantes elementos do array de controlos incluindo as propriedades Topo (Top) e Esquerda (Left);
• A única propriedade que difere do primeiro
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 26
elemento é a da Visibilidade (Visible);
• A declaração Load define a propriedade Visibilidade como Verdadeira ou Falsa.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 14
Procedimentos de Evento para um Array de Controlos:
• Apesar de existirem vários controlos definidos• Apesar de existirem vários controlos definidos no array apenas existe um procedimento associado a cada evento;
• O valor da propriedade Índice (Index) deve ser passado ao procedimento para indicar qual o l did
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 27
elemento pretendido.
Exemplo:Private Sub txtBox_GotFocus (Indice As Integer)
Criar um Array de Controlos Durante a Execução Array (em Run Time):
• É possível criar se os elementos de um array de controlos• É possível criar-se os elementos de um array de controlos durante a execução através da declaração Load;
• A unidade de medida standard é designada por Twip (1 inch = 1440 wip);
• Para posicionar um novo elemento do array durante a execução deve-se ajustar as suas propriedades Topo (Top)
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 28
e Esquerda (Left);
• Para o elemento tornar-se visível deve-se definir a sua propriedade Visibilidade (Visible) como Verdadeira.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 15
A localização e o
Verificar a Localização e o Tamanho de um Controlo no Ambiente do Visual Basic
A localização e o tamanho de um controlo
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 29
Exemplo ( Criar um array de controlos durante a execução)
Private Sub Form_Load()Dim i As Integer, monthNames As StringmonthNames = "FebMarAprMayJunJulAugSepOctNovDec"For i = 1 To 11
Load lblMonth(i)Load txtInfo(i)blMonth(i).Top = lblMonth(i - 1).Top + txtInfo(0).HeighttxtInfo(i).Top = txtInfo(i - 1).Top + txtInfo(0).Height
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 30
lblMonth(i).Caption = Mid(monthNames, 3 * i - 2, 3)lblMonth(i).Visible = TruetxtInfo(i).Visible = True
Next iEnd Sub
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 16
Ordenamento
• Uma prática comum envolvendo arrays é ordenar os• Uma prática comum envolvendo arrays é ordenar os elementos de um array de forma ascendente ou descendente.
• Um array pode ser ordenamento numericamente ou alfabeticamente (utilizando os valores ASCII).
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 31
• Existem várias técnicas para ordenar dados:– BubbleSort;– ShellSort;– ...
BubbleSort
O b bl t i t ã d• O bublesort consiste na comparação de elementos adjacentes e trocar os seus valores caso estejam fora de ordem.
• A comparação de todos os elementos do array é d i d
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 32
designada por passo.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 17
BubbleSort
For passNum = 1 To 4For passNum = 1 To 4
For index = 1 To 5 - passNum
If name(index) > name(index + 1) Then
Call SwapData( name( ), index)
End If
Next index
Igual ao número de elementos do vector menos 1
Subrotina para trocar os valores dos elementos
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 33
Next index
Next passNumvalores dos elementos name(index) e name(index+1)
Pode ser utilizada um flag para controlar se na anterior passagem foi realizada ou não alguma troca; caso não tenha sido efectuada nenhuma troca o vector já está ordenado e o programa pode sair da ordenação.
Subrotina para Trocar os Valores de duas Variáveis
Private Sub SwapData ( A ( ) As String, index As Integer)Private Sub SwapData ( A ( ) As String, index As Integer)
Dim temp As String
temp = A ( index)
A(index ) = A (index + 1)
A ( index + 1) = temp
End Sub
A(index) A(index+1)
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 34
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 18
BubbleSort
• O máximo número de passos necessários para ordenar os• O máximo número de passos necessários para ordenar os elementos de um array é igual ao número de elementos do array menos 1.
• O mínimo número de passos para ordenar um array pode ser igual um.
• Funciona de forma adequada para um número reduzido de
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 35
q pitens;
• É demasiado lento para listas longas (mais de 100 elementos).
ShellSort
• É similar ao bubblesort, mas em vez de comparar e trocar elementos adjacentes A(count) e A(count+1), compara e troca elementos não adjacentes A(count) e A(count + Gap), onde o valor de Gap começa consideravelmente maior do que 1. Apresenta um bom compromisso velocidade/simplicidade para listas com mais de 30 elementos.
• No inicio, Gap é definida como igual a metade do comprimento do array.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 36
• Após cada passagem, se a flag utilizada para indicar que houve alguma troca é verdadeira, é efectuada uma nova passagem com Gap igual a metade do valor anterior.
• No final o valor de Gap é igual a 1, e elementos adjacentes são comparados e trocados.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 19
Exemplo de Codificação do ShellSort
gap = Int(numParts / 2) ‘ valor inicialDo While gap >= 1
DodoneFlag = 1 ‘ flag para indicar que houve trocasFor index = 1 To numParts - gap
If part(index) > part(index + gap) ThenCall Swap( part(index), part(index + gap)doneFlag = 0 ‘houve uma troca
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 37
End IfNext index
Loop Until doneFlag = 1 ‘ ate nao haver trocasgap = Int(gap / 2) ‘igual a metade do valor anterior
Loop
Eficiência do BubbleSort e do ShellSort
Número de elementos no array e o número de comparações
Nº de Elementos BubbleSort ShellSort
5 10 15
15 105 115
25 300 302
necessárias para processar o ser ordenamento:
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 38
25 300 302
30 435 364
100 4950 2638
500 124,750 22,517
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 20
Arrays Bidimensionais
G d l t b l ( t i )• Guardam valores como uma tabela (ou matriz), agrupados em linhas e colunas;
• O primeiro índice identifica a linha e o segundo a coluna.
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 39
Declaração de um Array Bidimensional
Si t• Sintaxe:– Dim nome-do -array (m1 To n1, m2 To n2) As tipo-de-elementos
• Exemplo:– Dim rm (1 To 4, 1 To 4) As Single
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 40
para as colunas
para as linhas
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 21
Exemplo de array bidimensional: rm(1 To 4, 1 To 4)
0 2054 802 738 2054 0 2786 2706 802 2786 0 100 736 2706 100 0
Chicago
Los AngelesNew York
Philadelphia
Chicago Los Angeles New York Philadelphia
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 41
736 2706 100 0
Philadelphia
rm (2,2)rm (3,4)
(Array utilizado para guardar as distâncias entre 4 cidades.)
Manipulação de um Array Bidimensional
• Utili ar dois ciclos For Ne t emb tidos para atrib ir• Utilizar dois ciclos For ... Next embutidos para atribuir, ou aceder, a todos os elementos de um array bidimensional.
• Exemplo:For row = 1 To 4
F l 1 T 4
Exemplo de umFicheiro de entrada:
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 42
For col = 1 To 4
Input #1, rm(row, col)
Next col
Next row
0, 2054, 802, 738
2054, 0, 2786, 2706
802, 2786, 0, 100
738, 2706, 100, 0
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 22
Exemplo de um Array Bidimensional
Dim a(1 To 4 1 To 5 ) As IntegerDim a(1 To 4, 1 To 5 ) As Integer
Private Sub cmdDisplay_Click()
For j = 1 To 4
For k = 1 To 5
a (j, k) = (j - k) * j
picOutput.Print a(j,k);
Next k
Saída:
0 1 2 3 4
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 43
picOutput.Print
Next j
End Sub
0 -1 -2 -3 -4
2 0 -2 -4 -6
6 3 0 -3 -6
12 8 4 0 -4
Arrays Dinâmicos
•Em alguns problemas surge a necessidade de utilizar um arrayEm alguns problemas, surge a necessidade de utilizar um array, mas o seu tamanho apenas será definido durante a execução. O Visual Basic permite criar arrays dinâmicos, ou de tamanho variável. Para isso, o array deve ser declarado sem tamanho na secção general declarations de um formulário ou módulo.
Exemplo :
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 44
'Colocar dentro do general declarations de um formulário ou módulo
Dim Vector() as string * 25
•No interior do procedimento onde vai ser definido o tamanho, redimensionar o array usando a declaração ReDim.
CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI
@2009 - João Manuel R. S. Tavares 23
Arrays Dinâmicos
Exemplo:pSub Command1_click ()
ReDim Vector (n)End Sub
Importante: Sempre que se utilize o comando ReDim, todos os valores contidos no array são perdidos e o array é todo
@2009 - João Manuel R. S. Tavares CFAC: Visual Basic: VI - Arrays 45
preenchido com o valor NULL. Para aumentar o tamanho de um array sem que seu conteúdo seja perdido, utilizar a palavra chave Preserve.
Exemplo: ReDim Preserve Vector (n)