VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic:...

23
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 Basic 1) 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.

Transcript of VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic:...

Page 1: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 2: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 3: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 4: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 5: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 6: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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”.

Page 7: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 8: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 9: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 10: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 11: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 12: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 13: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 14: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 15: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 16: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 17: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 18: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 19: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 20: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 21: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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

Page 22: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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.

Page 23: VB modulo VI.ppt - paginas.fe.up.pttavares/ensino/CFAC/Downloads/Apontame… · CFAC: Visual Basic: VI - Arrays FEUP/DEMec/SDI @2009 - João Manuel R. S. Tavares 3 Declaração de

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)