[Índice Acima]

Estruturas de dados: matrizes

Os dados podem ser estruturados, e a forma mais simples de os estruturar são as matrizes, tabelas ou arrays. Estas são colecções de dados que se assemelham a uma lista (se com uma só dimensão), uma tabela (se com duas), um espaço (se com três), etc... No WSH/VBS as matrizes podem ter até sessenta dimensões.

Os elementos são acedidos através do seu índice. O índice do primeiro elemento é zero. Por exemplo, na matriz bidimensional

 

Sam Peckinpah
Orson Welles
Oliver Stone
George Lucas
Stephen Spielberg
Martin Scorcese

 

"Sam" é referido com os índices (0,0), e "Peckinpah" como (0,1); "Stone" como (2,1), etc...

As matrizes têm de ser declaradas obrigatoriamente com o seu nome e número de elementos. A matriz acima, que vamos chamar Realizadores, será declarada assim:

	dim Realizadores(6,1)

ou seja, seis "linhas" e duas "colunas", sendo que a segunda tem um só valor por cada entrada de linha; mas teremos de nos lembra que, como o primeiro elemento é de índice zero, o índice do último elemento desta tabela é 5.

Vejamos um pequeno script que usa dados arrumados numa matriz:

' Programa tabelas.vbs 21:42 11-05-2008
' Demonstração inicial do uso de uma matriz
' Com uso do vbCancel

' Criar a tabela e as restantes variáveis
' A tabela terá 3 "linhas" (primeiro índice)
' e duas "colunas" (segundo índice)
dim Tabela(3,1)
dim vbCancel ' exigida para usar vbCancel
Entrada = -1
Maximo1 = 0

' Preencher a tabela
Tabela(0,0)= "Andrade Corvo"
Tabela(0,1)= 9865015

Tabela(1,0)= "Madalena Singh"
Tabela(1,1)= 8648049

Tabela(2,0)= "Anfrósio Quelibate"
Tabela(2,1)= 7597539

' Achar o máximo de "linhas" da tabela
Maximo1 = clng(ubound(Tabela,1))

' Pedir uma entrada entre 1
' e o máximo de linhas da tabela
do
	Entrada= inputbox("Qual a entrada " & _
		"a mostrar? " & _
		 "(Até" & " " & Maximo1 & ")")
	' Se mandar cancelar, sair do script
	if Entrada=vbCancel then wscript.quit()
	' Converter para fazer 
	' a comparação na linha seguinte
	Entrada= clng(Entrada)
loop until ((Entrada > 0) and (Entrada <= Maximo1))

' Transformar o número de ordem em índice
Entrada = Entrada -1

' Abaixo, mostrar o índice de novo como
' número de ordem
msgbox 	Entrada+1 & " - " & _
	Tabela(Entrada,0) & " " & _
	Tabela(Entrada,1)

' FIM

Note que ubound é a instrução que devolve o número de elementos de uma dada dimensão da matriz. Também existe um lbound(), e só Zeus sabe porquê.

Apagar e mudar as dimensões das tabelas

Se usa tabelas muito grandes, pode ser-lhe necessário adaptar-lhe o tamanho aos dados, ou apagar uma antes de usar outra.

Para mudar o tamanho de uma tabela usa-se a instrução redim:

redim preserve Realizadores(1,1)

onde a opção preserve diz para se reterem os valores existentes na matriz. A instrução acima reduziria a matriz a:

Sam Peckinpah
Orson Welles

Sem a opção preserve, os valores seriam apagados. Para poder usar a instrução redim, a matriz terá de ter sido declarada inicialmente como matriz dinâmica, isto é, sem indicação de dimensões:

dim Realizadores()
redim Realizadores(5,2)

Se, de qualquer forma, reduzir a extensão das dimensões para menos do que os valores nela contidos, os dados são descartados sem aviso.

Para apagar uma matriz, usa-se a instrução erase.

No código abaixo, note que criamos e preenchemos a tabela de uma assentada com a instrução array().

' tabelas2.vbs 21:34 11-05-2008
' Demonstra a criação de uma matriz ad-hoc
' Redimensionamento e saída num só botão

' Subrotina -------------
sub MostraTudo
	' Mostra o conteúdo da tabela Tabela,
	' que deve ser global
	' vbNewLine produz uma nova linha
	' O conteúdo de Saida é apagado
	' entre chamadas da subrotina
	dim Saida, I
	Saida= Saida & "E o conteúdo é:" & vbNewLine

	for I=0 to ubound(Tabela)
	Saida= Saida  & vbNewLine & Tabela(I)
	next

	msgbox Saida
end sub


' PROGRAMA PRINCIPAL ------------------------------
' criar uma tabela 
Tabela= array("João", "José", "Joaquim", "Joaquina")

' Mostrar tudo
MostraTudo

' Redimensionar e voltar a mostrar
redim preserve Tabela(1)
MostraTudo

' FIM ----------------------------------------------

O ciclo for each..next

Para percorrer sequencialmente matrizes e colecções (havemos de falar destas), existe o ciclo for each..next. Como demonstração:

' cores.vbs - 12:18 13-05-2008
' Demo do ciclo for each..next

' Matriz linear criada ad-hoc
ArcoIris= array("vermelho","alaranjado","amarelo",_
		"verde","azul","anil","violeta")

' Variável para conter os elementos um a um
dim Cor

' Ciclo
for each Cor in ArcoIris
	' Afixar se a primeira letra é v
	if mid(Cor,1,1) = "v" then msgbox Cor, _
		vbInformation, "Cores"
next

' FIM

Exercícios

  1. Escreva um programa que afixe a tabuada de um número. (Não necessita de matrizes, apenas de fazer a saída numa só janela.)
  2. Modifique o primeiro programa acima por forma a que inclua também o tratamento: "Sr", "Sra", "Menina", "Dr", etc. e depois mostre tudo numa só linha.
  3. Modifique ainda o programa referido em 1 por forma a aceitar novas entradas na lista, feitas pelo utilizador.
  4. Modifique-o mais ainda, por forma a que o utilizador possa também suprimir entradas existentes.

Sugestão: uma forma de manter uma "cábula" para as instruções de uma linguagem é o ZuluPad.

 

Índice | Comente


Início: 20:39 11-05-2008

Última modificação: 2008-05-13 12:38