Escolar Documentos
Profissional Documentos
Cultura Documentos
Fevereiro de 2009
www.foresp.pt
ÍNDICE:
1. INTRODUÇÃO ................................................................................................................................... 1
2. CONCEITOS GERAIS....................................................................................................................... 1
3. ESTRUTURAS DE CONTROLO DE REPETIÇÃO....................................................................... 1
3.1. ESTRUTURAS DE REPETIÇÃO CONTADAS ........................................................................................... 2
3.1.1. A estrutura de repetição For ... Next ........................................................................................ 2
3.1.2. A estrutura de repetição For Each … Next .............................................................................. 3
3.2. ESTRUTURAS DE REPETIÇÃO CONDICIONAIS...................................................................................... 4
3.3. ESTRUTURAS DE REPETIÇÃO ENCAIXADAS ........................................................................................ 7
4. SUBROTINAS E FUNÇÕES.............................................................................................................. 8
4.1. SUBROTINAS ...................................................................................................................................... 8
4.2. FUNÇÕES ............................................................................................................................................ 9
4.3. PASSAGEM DE ARGUMENTOS ........................................................................................................... 10
5. ESTRUTURAS DE DADOS INDEXADAS .................................................................................... 12
5.1. VECTORES OU ARRAYS UNIDIMENSIONAIS ...................................................................................... 12
5.1.1. Declaração de vectores .......................................................................................................... 13
5.1.2. Inicializar um array................................................................................................................ 14
5.1.3. Obtenção do último índice de um vector: GetUpperBound() ................................................. 14
5.1.4. Redimensionamento de vectores - Instrução ReDim .............................................................. 14
5.1.5. Processamento de vectores..................................................................................................... 14
5.1.6. Passagem de vectores como argumentos de funções e rotinas............................................... 16
5.1.7. Pesquisa em Vectores ............................................................................................................. 18
5.1.8. Ordenação de vectores ........................................................................................................... 20
5.2. MATRIZES – ARRAYS BIDIMENSIONAIS ............................................................................................ 22
5.2.1. Declaração de matrizes.......................................................................................................... 23
5.2.2. Declaração sem indicação das dimensões ............................................................................. 23
5.2.3. Redimensionamento................................................................................................................ 23
5.2.4. Passagem de matrizes como argumentos de funções e rotinas .............................................. 24
5.2.5. Obtenção do limite máximo (índice)....................................................................................... 24
5.2.6. Processamento de Matrizes .................................................................................................... 24
6. STRINGS ........................................................................................................................................... 28
6.1. FUNÇÕES DE MANIPULAÇÃO DE STRINGS ........................................................................................ 28
6.1.1. Trim, LTrim e RTrim .............................................................................................................. 28
6.1.2. Len.......................................................................................................................................... 28
6.1.3. Right(), Left().......................................................................................................................... 29
6.1.4. Mid()....................................................................................................................................... 29
6.1.5. InStr() ..................................................................................................................................... 29
6.1.6. UCase(), LCase().................................................................................................................... 30
6.2. EXEMPLOS RESOLVIDOS ................................................................................................................... 30
6.3. EXERCICIOS COMPLEMENTARES ...................................................................................................... 32
6.3.1. 1. Estruturas de Dados Mono-indexadas (Vectores).............................................................. 32
6.3.2. Estruturas de Dados Bi-indexadas (Matrizes)........................................................................ 32
6.3.3. Strings..................................................................................................................................... 33
7. BIBLIOGRAFIA ............................................................................................................................... 34
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
1. Introdução
O Visual Basic em geral e a versão 2008, em particular, possui um conjunto de características que
visam ajudar tanto o programador principiante como o experiente a desenvolver aplicações de forma
simples, rápida e divertida.
Neste contexto e no âmbito do módulo Estrutura de Dados Estáticas, pretende-se que, no final
da frequência da disciplina, os alunos sejam capazes de:
• compreender os conceitos fundamentais das Ciências da Computação e aplicá-los em
exemplos concretos;
• compreender a importância das estruturas de repetição na programação de computadores;
• saber quando usar as diferentes estruturas de controlo de repetição;
• analisar problemas, conceber algoritmos através de uma abordagem modular descendente e
desenvolver os algoritmos através de uma metodologia de programação procedimental
estruturada e recorrendo a estruturas de controlo de repetição e estruturas de dados
indexadas;
• reconhecer a importância da utilização de vectores;
• compreender os algoritmos de manipulação de vectores e strings;
• codificar os programas em Visual Basic e testar as aplicações resultantes.
Refira-se que nos exemplos apresentados as aplicações são do tipo consola considerando-se ser
esta a melhor forma de se aprender uma linguagem de programação , uma vez que o objectivo
principal está nos elementos da linguagem de programação.
2. Conceitos Gerais
Um dos aspectos fundamentais na definição de estruturas de controlo de repetição está relacionada
com a garantia de término. Uma das características de um programas é este deve ser finito.
Por iteração consideramos repetição. Em programação, o termo iteração é usado para designar cada
uma das vezes que as instruções do corpo de um ciclo são executadas.
Um contador ou variável contadora é uma variável que realiza uma contagem, normalmente
associada ao nº de vezes que o ciclo é executado. A variável contadora é iniciada a zero fora do ciclo e
incrementada dentro do ciclo. O contador pode ou não ser usado na condição de término do ciclo.
Um acumulador ou variável acumuladora permite efectuar ao soma de um conjunto de valores,
armazenando somas ou totais parciais. A semelhança do contador é iniciada a zero fora do ciclo sendo-
lhe adicionado um valor (positivo ou negativo), normalmente, em cada iteração. O acumulador pode
ou não ser usado na condição de término do ciclo.
www.foresp.pt
Enquanto as estruturas de controlo condicional permitem alterar o fluxo do programa mas sem
deixar de executar de forma linear uma dada sequência de instruções, as estruturas de controlo de
repetição (também conhecidas por ciclos) permitem repetir um dado conjunto de instruções o número
de vezes que for necessário.
Existem diversas variantes de ciclos, diferindo umas das outras pela forma como é controlada a
execução das instruções contidas no corpo do ciclo.
Genericamente, pode dizer-se que uma estrutura de controlo repetitiva (ou ciclo) assegura a
execução repetida de um dado conjunto de instruções dependendo do resultado do teste de uma
determinada condição de funcionamento.
Esta estrutura baseia-se na existência dum contador que incrementa automaticamente o conteúdo
de variável, chamada variável de controlo do ciclo, cada vez que o ciclo funciona, isto é, cada vez que as
instruções contidas no corpo do ciclo são executadas. O valor inicial dessa variável é início.
A inicialização da variável contadora, o seu incremento/decremento e a verificação da condição de
funcionamento do ciclo (variável <= fim) é da responsabilidade da própria estrutura de controlo. O
www.foresp.pt
programador deve, apenas, especificar qual o valor de início e de fim (ou, por outras palavras, o número
de vezes que o ciclo vai funcionar) e quais as instruções que o ciclo vai repetir (o corpo do ciclo).
O conteúdo da variável de controlo do ciclo pode ser utilizado por instruções contidas no corpo do
ciclo, mas não deve, sob pretexto algum, ser modificado por estas instruções, sob pena de se perder o
controlo do funcionamento do ciclo.
A estrutura de controlo verifica no início de cada iteração (repetição) do ciclo se a condição de
funcionamento do ciclo é ainda verdadeira. Caso seja falsa, o ciclo terminará, e o programa passará a
executar as instruções que se seguem.
A inclusão de Step é opcional: caso se pretenda que o conteúdo da variável contadora seja
incrementada uma unidade de cada vez, é desnecessário especificar passo, caso contrário, passo permitirá
incrementar o valor de variável de um valor diferente da unidade (positivo ou negativo).
Caso o valor de passo seja positivo a variável contadora será incrementada. Se pretendermos, no
entanto, efectuar um decremento, deverá ser utilizado um valor negativo para passo. Obviamente, nesse
caso, a condição de funcionamento do ciclo passará a ser variável >= fim.
Exemplos:
Factorial de um Numero com incremento Factorial de um Numero com decremento
Factorial = 1 Factorial = 1
For num = 1 To Numero For num = Numero To 1 Step -1
Factorial = Factorial * num Factorial = Factorial * num
Next num Next num
www.foresp.pt
Exemplo:
‘Contar vogais de uma string
Module ContarVogais
Sub Main()
Console.Write("Introduza uma string: ")
Dim str As String = Console.ReadLine
Dim contaVogais As Integer = 0
End Module
www.foresp.pt
• Do Until … Loop (DUL), teste da expressão lógica no início, o ciclo é executado até
que a expressão seja verdadeira
Do Until < condição >
<bloco de instruções>
Loop
Exemplo:
Programa que determina a soma dos algarismos de um número inteiro:
• Do … Loop Until (DLU), teste da expressão lógica no fim, executa até que a expressão
seja verdadeira
Do
<bloco de instruções>
Loop Until < condição >
www.foresp.pt
Exemplo:
Programa que determina a soma dos algarismos de um número inteiro:
O exemplo apresentado podia ser resolvido de forma satisfatória por qualquer um dos ciclos mas
nem sempre é assim
É possível identificar duas situações distintas:
1 - O ciclo deve ser executado pelo menos uma vez, então o teste deve ser executado no
fim do ciclo, através de DLW e DLU
2 - O ciclo pode não ser executado uma única vez, então o teste deve ser no início do
ciclo, através de DWL e DUL
É possível, transformar um ciclo Do While em Do Until negando a condição de funcionamento. A
escolha entre Do While e Do Until é subjectiva; são equivalentes se a expressão lógica for negada.
Como vimos anteriormente a estrutura de repetição For ... Next permite realizar um ciclo
controlado por um variável contadora que é incrementada ou decrementada até atingir um valor final
pré-fixado. É possível obter este efeito usando estruturas de controlo alternativas, como seja a
estrutura Do While … Loop ou o Do Until … Loop. Dizemos neste caso que os ciclos são
controlados por contador.
Um ciclo controlado por contador baseado na estrutura Do While … Loop pode assumir a
seguinte forma genérica:
contador = valor_inicial
Do While contador <= valor_final
' Corpo do Ciclo
contador = contador + 1
Loop
Questões a ter em conta na construção de um ciclo Do While … Loop controlado por contador:
• Especificar a condição de funcionamento do ciclo
• Inicializar a variável contadora
• Incluir no corpo do ciclo uma instrução que incremente ou decremente a variável
contadora
Estas acções encontram-se asseguradas de forma automática no caso da estrutura
For ... To ... Next. Em todas as outras formas de ciclos, é da responsabilidade do programador
assegurar-se de que tais acções são correctamente executadas.
www.foresp.pt
Exemplos:
Cálculo do factorial de uma sequência de valores terminada por um valor negativo.
Factorial de uma sequência de valores
Module Module1
Sub Main()
Dim num, contador As Integer
Dim factorial As Long
Este exemplo utiliza apenas ciclos controlados por sentinela. Quando se usa um ciclo controlado
por contador encadeado num outro ciclo controlado por contador, há que ter o cuidado de criar e
utilizar diferentes variáveis de controlo para cada ciclo.
O programa seguinte apresenta todos os números capicuas existentes num intervalo dado pelo
utilizador (os limites do intervalo devem ser validados). Um número é capicua se for igual à sequência
dos seu algarismos, por ordem inversa. É preciso verificar se cada um dos números do intervalo é
capicua.
Números capicuas
Module Module1
Sub Main()
Dim num, aux, cap, alg, inf, sup As Integer
Do
inf = InputBox("Introduza valor inferior:", "Capicuas")
Loop Until inf > 0
Do
sup = InputBox("Introduza valor Superior:", "Capicuas")
Loop Until sup > inf
For num = inf To sup
aux = num
cap = 0
Do While aux > 0
alg = aux Mod 10
aux \= 10
cap = cap * 10 + alg
Loop
If cap = num Then MsgBox("É capicua " & num)
Next
End Sub
End Module
www.foresp.pt
4. Subrotinas e Funções
Um programa em é constituído por um conjunto de módulos, que irão ser resolvidos de forma
independente entre si, com o propósito de contribuírem em conjunto para a realização da tarefa
principal, que é a resolução do problema proposto.
A esses módulos dá-se o nome de funções, subrotinas, subprogramas ou procedimentos.
Uma Subrotinas/Função é então um módulo independente de código, que irá executar uma tarefa
específica. Consoante a especificidade da tarefa atribuída à função, esta terá ou não de devolver um
valor.
Em Visual Basic podemos distinguir dois tipos de rotinas:
• Função (Function)– baseada no conceito matemático de função, em que o resultado é
necessariamente um único valor
• Subrotina (Sub)– implementando um mecanismo de “subcontratação” de tarefas, não sendo
representável por um valor
4.1. Subrotinas
No Visual Basic existem procedimentos que são executados em resposta às acções do utilizador,
como por exemplo quando o utilizador prime um botão (Click). Esses procedimentos são conhecidos
por "event procedures" - procedimentos de evento.
No entanto, existem outros procedimentos que não estão directamente associados a qualquer
evento e que para serem executados têm que ser explicitamente invocados. Estes são procedimentos
mais gerais - “general procedures”.
A principal razão para se usar este tipo de procedimentos tem a ver com o facto de, por vezes,
diferentes procedimentos de evento necessitarem de executar o mesmo conjunto de acções
(instruções). Nestas situações o ideal é colocar esse conjunto de acções num procedimento para evitar
a duplicação de código e tornar a aplicação mais fácil de manter.
A sintaxe para declarar um procedimento é a seguinte:
Sub Nome_subrotina([<lista de parâmetros>])
<instruções>
End Sub
www.foresp.pt
Module Module1
argumento
Sub Main()
Dim n1, n2 As Integer
n1 = 5 soma é uma variável local; o âmbito da
n2 = 2 variável é o do procedimento; a variável só
existe durante a execução da subrotina
' Chamada
MostraSoma(n1, n2)
Console.ReadKey() Tipo de parâmetro
Nome do parâmetro
End Sub
'Declaração
Sub MostraSoma(ByVal num1 As Integer, ByVal num2 As Integer)
Dim soma As Integer
Tipo de valor do parâmetro
soma = num1 + num2
Console.WriteLine(num1 & " + " & num2 & " = " & soma)
End Sub
End Module
4.2. Funções
O Visual Basic tal como qualquer outra linguagem de programação inclui um vasto conjunto de
funções predefinidas. Para além destas funções o VB permite definir outras funções usando para o
efeito a sintaxe seguinte:
Var = Nome_função([lista_parâmetros])
As funções distinguem-se dos procedimentos porque devolvem um valor. Sendo assim, e tal como
nas variáveis, as funções também têm um tipo de dados que será o tipo do valor a retornar.
O valor, normalmente resultante de algumas operações e/ou cálculos, é devolvido por atribuição a
uma "variável" com o mesmo nome da função.
www.foresp.pt
Module Module1
Sub Main()
Dim n As Integer
n = InputBox("Valor de n: ")
If n > 0 Then
MsgBox("factorial de " & n & "=" & fact(n))
Else
MsgBox("Erro: dados inválidos!")
End If
End Sub
End Module
1 Por método pretendemos referir-nos a funções, procedimentos, subrotinas e/ou métodos (na POO).
Ana Madureira - 10 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Troca(a, b) Troca(a, b)
Public Sub Troca(ByVal x As Double, ByVal y As Double) Public Sub Troca(ByRef x As Double, ByRef y As Double)
' Os valores das variáveis a e b são copiados para x e y. ' As variáveis x e y correspondem às variáveis a e b.
Dim tmp As Double Dim tmp As Double
A saída do programa será: A saída do programa será:
tmp = x tmp = x
Antes da troca: a=10 b=20 Antes da troca: a=10 b=20
x = y x = y
Depois da troca: a=10 b=20 Depois da troca: a=20 b=10
y = tmp y = tmp
' Os valores de x e y foram trocados. ' Os valores de x e y foram trocados.
' Os valores de a e b mantêm-se inalterados! ' Os valores de a e b também.
End Sub End Sub
O exemplo que se segue apresenta o factorial e o valor da fórmula de Stirling (uma aproximação à
função factorial) e ainda a diferença, em percentagem, entre ambos.
Sub Main()
For i As Integer = 2 To n
fact *= i
Next
Return fact
End Function
End Module
Ana Madureira - 11 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
A saída será:
Ana Madureira - 12 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplos:
Ao ser criado, os elementos do vector são inicializados tal como qualquer variável simples:
• Tipos numéricos com zero
• Strings com a palavra reservada Nothing
• O primeiro elemento do vector ocupa o indíce 0
• Tamanho ou dimensão do vector: <indíceSuperior> + 1
Exemplos:
Dim var_Multipla(8) As Integer
Dim notas(30) As Single
Dim nomes(100) As String
Nota: num_elementos não se refere ao valor máximo que a variável índice pode assumir (7, no caso
do vector var_Multipla) mas sim ao número de elementos do vector (8, neste caso).
Usando esta forma na declaração de vectores, o processo de indicar o limite inferior faz-se de
forma implícita: por defeito assume-se como limite inferior do índice o valor zero (ou 1 se tal for
especificado mediante a instrução Option Base 1).
Uma forma alternativa de utilizar a instrução Dim para declarar vectores implica a utilização da
palavra reservada To, permitindo especificar o menor e o maior valor que o índice pode assumir:
2 Adicionalmente, a instrução Dim atribui valores iniciais a todos os elementos do vector (zeros no caso de vectores numéricos e strings
nulas no caso de vectores alfa-numéricos)
Ana Madureira - 13 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplos:
Dim numeros(100 To 200) As Integer
Dim valores(-100 To 100) As Single
Exemplo:
notas.GetUpperBound(0) vale 4
Neste caso, após a instrução ReDim todo o conteúdo do vector é inicializado (tipos numéricos a 0,
strings a Nothing)
Ana Madureira - 14 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplo 1:
Este programa permite calcular e apresentar sob a forma de uma tabela as raízes quadradas de
todos os números inteiros compreendidos entre 0 e um dado limite superior a especificar pelo
utilizador na TextBox txtMaior (a largura do intervalo não deve exceder 100). Os valores calculados
são armazenados num vector para eventual futura utilização.
Como vimos, o processamento dos elementos de um vector consistiu em operações de escrita (de
atribuição) que modificaram o seu conteúdo. É igualmente possível efectuar operações de leitura sobre
todos ou parte dos elementos dum vector. Nesse caso, como é óbvio, a variável do tipo Array deverá
encontrar-se do lado direito da operação de atribuição:
var = vector(índice)
Exemplo 2:
Escreva um programa que leia as notas de uma turma (número de alunos dado) para um vector,
determine a média e o desvio padrão dessas mesmas notas. O programa deve ainda apresentar numa
ListBox as notas da turma que estejam acima da média.
Ana Madureira - 15 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
End If
Loop While n < Val(txtN.Text) And nota <> -1
If n > 0 Then
med = soma / n
txtMed.Text = med
txtN.Text = n
For t = 1 To n
If vec(t) > med Then
lstSupNotas.Items.Add(t & " - " & vec(t))
End If
Next
For t = 1 To n
aux = aux + (vec(t) - med) ^ 2
Next
dp = Math.Sqrt(aux / n)
txtDP.Text = dp
Else
MsgBox("Não foram introduzidos valores!")
End If
End Sub
Ana Madureira - 16 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplo:
...
Dim v1() As Integer = {10, 20, 30, 40, 50}, sm As Integer
sm = soma(v1) ‘chamada á função
...
Function soma(ByVal v() As Integer) As Integer
Dim s As Integer
For i As Integer = 0 To v.GetUpperBound(0)
s += v(i)
Next
Return (s)
End Function
Exemplo
Faça a leitura das pontuações que 5 juízes de uma determinada prova atribuíram a um atleta (valores
compreendidos entre 0 e 9 inclusive). Determine e apresente com formato adequado, os seguintes
valores:
• média obtida pelo atleta
• a pior e a melhor pontuação
• a percentagem de pontuações iguais ou superiores a 8 valores
• supondo que a 1ª nota foi atribuída pelo juiz nº1 e assim sucessivamente determine os
números dos juízes que atribuíram a melhor nota do atleta.
Module Module1
Const NJUIZES As Integer = 5
Sub Main()
Dim notas(NJUIZES-1), notmax, notmin As Double
leitura_pont(notas)
Console.WriteLine("Média: {0:F2}", media_pont(notas))
maxmin(notas, notmax, notmin)
Console.WriteLine("Melhor nota: {0:F2}", notmax)
Console.WriteLine("Pior nota: {0:F2}", notmin)
Console.WriteLine("Percentagem de notas > 8: {0:F2}", _
percentag(notas, 8))
juizes_max(notas, notmax)
End Sub
Sub leitura_pont(ByRef pont() As Double)
For i As Integer = 0 To NJUIZES - 1
Do
Console.Write("Introduza nota do juiz " & i + 1 & ": ")
pont(i) = CDbl(Console.ReadLine())
Loop While Not valida(pont(i))
Next
End Sub
Ana Madureira - 17 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
End Module
A saída sera:
Ana Madureira - 18 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplo:
Seja um vector VectQualquer com Max elementos, pretende-se procurar usando o método de
pesquisa sequencial, um valor num em VectQualquer . Para verificar se o valor contido na variável
num se encontra armazenado no vector VectQualquer, podemos usar o programa que a seguir se
descreve.
Este programa encontra-se dividido em dois procedimentos, um associado ao botão de comando
“Go” e o outro ao botão “Pesquisa”. O primeiro serve para preencher o vector VectQualquer com
valores que possam posteriormente ser pesquisados. O segundo destina-se a pesquisar dentro de
VectQualquer a existência de um dado número inteiro a indicar pelo utilizador.
Repare-se nas duas declarações iniciais colocadas fora de qualquer procedimento. Diz-se que estas
declarações são globais, pelo facto de se encontrarem na secção “General” do programa em vez de
inseridas num dado procedimento, são reconhecidas por todos os procedimentos do programa, e
portanto, acessíveis de dentro de qualquer deles.
Pesquisa sequencial
Const N As Integer = 9
Outro método bastante usado para procurar informação armazenada em vectores é o método da
pesquisa binária. Trata-se de uma alternativa mais rápida à procura sequencial mas exige que os
elementos do vector estejam ordenados (por ordem ascendente ou descendente).
Este método consiste em pesquisar sucessivamente os elementos a meio de subintervalos do vector,
subintervalos esses que vão sendo reduzidos a metade. Começa-se então por verificar o elemento a
meio do vector. Se não for o valor procurado, então este só pode estar na metade inferior ou superior
do vector, uma vez que é suposto o vector estar ordenado. Assim, a segunda pesquisa incide apenas
sobre metade do vector. Este processo repete-se até se encontrar o elemento desejado (sucesso) ou
Ana Madureira - 19 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
determinar que não se encontra no vector (insucesso). Repare-se que o número de elementos a
pesquisar vai sendo reduzido sucessivamente a metade. Daí a designação de pesquisa binária e a razão
pela qual é mais rápida que a sequencial.
Exemplo :
Para verificar se o valor contido na variável num se encontra armazenado no vector vec
(considerando que este vector se encontra ordenado de forma ascendente) podemos usar a função
seguinte:
Pesquisa Binária
Module Module1
Sub Main()
Dim v() As Integer = {8, 4, 10, 9, 7, 2}
seleccao(v)
p = p_binaria(v, 9)
If p <> -1 Then
Console.WriteLine("Elemento na posição " & p)
Else : Console.WriteLine("Não encontrado!")
End If
End Sub
Ana Madureira - 20 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplo:
O programa apresentado de seguida ordena o vector de forma ascendente, tal como se mostrou na
figura anterior. O programa encontra-se dividido em dois procedimentos, o primeiro associado ao
botão de comando “Go” que serve para encher o vector e o segundo ao botão “Ordenar” que efectua
a ordenação ascendente dos valores introduzidos e que ficaram guardados no vector VectQualquer.
Const N As Integer = 9
Dim VectQualquer (N) As Integer
Ana Madureira - 21 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
3 - Inserção ordenada
Neste método, todos os elementos são tratados um de cada vez, inserindo-se cada um no seu lugar.
O elemento corrente é inserido, movendo-se os elementos de valor superior uma posição para a
direita.
Os elementos que se encontram à esquerda do elemento i são os ordenados, apesar de não se
encontrarem na sua posição definitiva, porque podem ainda ser movidos para a direita.
Inserção ordenada
Sub insercao(ByRef v() As Integer)
Dim i, j, x As Integer
For i = 1 To v.GetUpperBound(0)
x = v(i)
For j = i to 1 Step -1
If v(j - 1) > x Then
v(j) = v(j - 1)
Else : Exit For
End If
Next j
v(j) = x
Next i
End Sub
Ana Madureira - 22 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
X Y Z
0 1 2 índice_coluna
Pontos
2
3
4
índice_linha
Exemplos:
Exemplos:
5.2.3. Redimensionamento
ReDim arrayName(<iSupLin>,<iSupCol>)
ReDim Preserve arrayName(<iSupLin>,<iSupCol>)
Ana Madureira - 23 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Declaração de parâmetros:
• Passagem por valor - ByVal nomeMatriz( , ) As tipoVar
• Passagem por referência - ByRef nomeMatriz ( , ) As tipoVar
Exemplo:
...
Dim mat(4,4) As Integer
sm = soma(mat) ‘chamada á função
...
Ana Madureira - 24 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Nas matrizes, tal como nos vectores, a forma mais adequada de executar uma mesma acção sobre
parte ou a totalidade dos seus elementos é utilizando duas estruturas de controlo repetitivo: uma para
processar as linhas e outra para as colunas da matriz.
O programa anterior apresenta uma matriz em que cada elemento é encontrado somando os índices
que o identificam. As dimensões da matriz a ser criada são especificadas pelo utilizador e os valores
calculados são armazenados numa matriz. De notar que neste programa se usaram duas variáveis: i e j,
para controlar os ciclos de repetição e armazenar os valores achados na respectiva matriz. A variável i
percorre todas as linhas e para cada linha é usada a variável j para percorrer as colunas.
Exemplo 2:
O exemplo seguinte declara uma matriz em que o tamanho é especificado pelo utilizador. Cada
elemento da matriz será inicializada com o valor i*10+j.
' Matrizes: tamanho definido pelo utilizador.
Module Module1
Sub Main()
Console.Write("Quantas linhas? ")
Dim linhas As Integer = CInt(Console.ReadLine)
Console.Write("Quantas colunas? ")
Dim colunas As Integer = CInt(Console.ReadLine)
' Declara a matriz.
Dim valores(linhas - 1, colunas - 1) As Integer
' Inicia e visualiza os elementos da matriz.
For i As Integer = 0 To valores.GetUpperBound(0)
Console.Write("Elementos da linha {0}: ", i)
For j As Integer = 0 To valores.GetUpperBound(1)
' Inicia os elementos com o valor i*10+j
valores(i, j) = i * 10 + j
Console.Write("{0,4}", valores(i, j))
Next
Console.WriteLine()
Next
Console.ReadKey()
End Sub
End Module
A saída sera:
O número de colunas da 1ª matriz tem que ser igual ao número de linhas da 2ª, isto é, nc1 == nl2.
O resultado é uma matriz nl1 x nc2
mij = ∑ maik ⋅ mbkj
k
Ana Madureira - 25 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Module Module1
Sub Main()
Dim ma(,) As Double, mb(,) As Double, mr(,) As Double
ler_matriz(ma)
ler_matriz(mb)
If mult(ma, mb, mr) Then
mostra_matriz(mr)
Else
Console.WriteLine("Não é possível multiplicar matrizes")
End If
End Sub
Sub ler_matriz(ByRef m(,) As Double)
Console.Write("Número de linhas: ")
Dim l As Integer = CInt(Console.ReadLine())
Console.Write("Número de colunas: ")
Dim c As Integer = CInt(Console.ReadLine())
ReDim m(l - 1, c - 1)
For i As Integer = 0 To l - 1
Console.WriteLine("Linha " & i)
For j As Integer = 0 To c - 1
Console.Write("(" & i & "," & j & ")=")
m(i, j) = CDbl(Console.ReadLine())
Next
Next
End Sub
Sub mostra_matriz(ByVal m(,) As Double)
For i As Integer = 0 To m.GetUpperBound(0)
For j As Integer = 0 To m.GetUpperBound(1)
Console.Write("{0,7:F2}", m(i, j))
Next
Console.WriteLine()
Next
End Sub
Para que a operação de adição entre duas matrizes seja possível, estas devem ser da mesma ordem,
ou seja, deverá possuir o mesmo número de linhas e de colunas. A soma entre duas matrizes é
Ana Madureira - 26 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
realizada entre a soma dos elementos da linha 1 da 1ª matriz pelos elementos da linha 1 da segunda
matriz e assim sucessivamente.
Module Module1
Sub Main()
Dim ma(,) As Double, mb(,) As Double, mr(,) As Double
ler_matriz(ma)
ler_matriz(mb)
If soma(ma, mb, mr) Then
mostra_matriz(mr)
Else
Console.WriteLine("Não é possível somar as matrizes")
End If
Console.ReadKey()
End Sub
Function soma(ByVal ma(,) As Double, ByVal mb(,) As Double,
ByRef mr(,) As Double) As Boolean
If ma.GetUpperBound(0) <> mb.GetUpperBound(0) Or _
ma.GetUpperBound(1) <> mb.GetUpperBound(1) Then
Return False
End If
ReDim mr(ma.GetUpperBound(0), mb.GetUpperBound(1))
For i As Integer = 0 To ma.GetUpperBound(0)
For j As Integer = 0 To ma.GetUpperBound(1)
mr(i, j) = ma(i, j) + mb(i, j)
Next
Next
Return True
End Function
Sub ler_matriz(ByRef m(,) As Double)
Console.Write("Número de linhas: ")
Dim l As Integer = CInt(Console.ReadLine())
Console.Write("Número de colunas: ")
Dim c As Integer = CInt(Console.ReadLine())
ReDim m(l - 1, c - 1)
For i As Integer = 0 To l - 1
Console.WriteLine("Linha " & i)
For j As Integer = 0 To c - 1
Console.Write("(" & i & "," & j & ")=")
m(i, j) = CDbl(Console.ReadLine())
Next
Next
End Sub
Sub mostra_matriz(ByVal m(,) As Double)
For i As Integer = 0 To m.GetUpperBound(0)
For j As Integer = 0 To m.GetUpperBound(1)
Console.Write("{0,7:F2}", m(i, j))
Next
Console.WriteLine()
Next
End Sub
End Module
Ana Madureira - 27 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
6. Strings
Uma grande parte das linguagens de programação permitem manipular caracteres e/ou conjuntos
de caracteres.
Uma string, que em português refere-se normalmente por “cadeia de caracteres”, será uma
entidade que representa um conjunto de caracteres. Em Visual Basic, uma string é representada
internamente como um vector de números inteiros, em que cada número representa um carácter.
Sintaxe:
– String Dim <nome> as String
Exemplo
Dim st1 As String, st As String
…
st1 = txtMyString.Text
st = "Olá" + " " & st1
Retornam uma string idêntica à original, mas com espaços eliminados no início e/ou fim da string.
Exemplo:
Dim st1 As String, st2 As String
st1 = “ Olá Mundo! “
st2 = Trim(st1) st2 = "Olá Mundo!" – Foram eliminados os espaços no início e no fim da string.
st2 = LTrim(st1) st2 = "Olá Mundo! " – Foram eliminados os espaços no início da string (left).
st2 = RTrim(st1) st2 = " Olá Mundo!" – Foram eliminados os espaços no fim da string (right).
Os espaços que esteja entre outros caracteres da string não são afectados por estas rotinas.
6.1.2. Len
Retorna o número de caracteres da string.
Exemplo:
Ana Madureira - 28 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplos:
Dim st1, st2 As String, k As Integer
st1 = “Olá Mundo!”
k=2
st2 = Left(st1, k) st2 ← “Ol” – os dois primeiros caracteres, a partir da esquerda
st2 = Right(st1, k) st2 ← “o!” – os dois primeiros caracteres, a partir da direita
st1 = Right(st1, Len(st1) – 1) Copia todos os elementos da string, a partir da direita, com excepção
do primeiro → eliminar o primeiro carácter de uma string
6.1.4. Mid()
Copia o número de caracteres indicado a partir da posição inicial passada como parâmetro; o número
de caracteres é opcional; se não for indicado, copia tudo até ao fim da string
Exemplos:
Dim st1, st2 As String, k As Integer
st1 = “Olá Mundo!”
st2 = Mid(st1, 2, 3) st2 ← “lá ” – copia 3 caracteres a partir da segunda posição
st2 = Mid(st1, 6, 8) st2 ← “undo!” – copia os caracteres a partir da 6ª posição; como o número de
caracteres ultrapassa o limite da string, apenas são copiados os caracteres existentes
6.1.5. InStr()
Procura uma string dentro de outra; a posição inicial é opcional – se não for indicada a pesquisa é
iniciada na posição 1 (início da string)
InStr([<pos_init> as Integer,] <original> as String, <padrão> as String) as Integer
Ana Madureira - 29 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
Exemplos:
Dim st1 As String, k As Integer
st1 = “Olá Mundo!”
k = InStr(st1, “ “) k← 4 – posição do primeiro espaço
k = InStr(5, st1, “ “) k ← 0 – não existe qualquer espaço a partir da posição 5
Exemplos:
Dim st1, st2 As String
st1 = “Olá 1,2,3!”
st2 = UCase(st1) st2 ← “OLÁ 1,2,3!”
st2 = LCase(st1) st2 ← “olá 1,2,3!”
Ana Madureira - 30 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
2. Escreva uma função que recebe uma string como parâmetro e retorna o número de palavras que a
string contém.
3. Escreva uma função que recebe uma string e um número n como parâmetros e retorna uma string
com as palavras da primeira com menos de n caracteres.
Ana Madureira - 31 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
• dos 10 números lidos, mostre todos os que são maiores que os seus vizinhos;
• retorne a maior diferença absoluta entre dois números consecutivos; também deverá
retornar a posição destes dois números onde existe a maior diferença;
• retorne a mediana dos 10 números; a mediana é o valor central de uma série de números;
quando o número de elementos é par, define-se mediana como a média dos dois números
centrais;
Cada pedido deve ser realizado através de uma rotina. O programa deverá testar as rotinas
escritas.
1. Defina uma rotina para ler a partir da consola uma matriz cujas dimensões são indicadas pelo
utilizador e outra para apresentar na consola o conteúdo de uma matriz cujas dimensões são
indicadas pelo utilizador.
2. Defina uma rotina que multiplique duas matrizes dadas como argumentos (a multiplicação de
duas matrizes só é possível se o nº de colunas da 1ª matriz é igual ao nº de linhas da segunda
matriz).
m ij = ∑ a ik b kj
k
3. Defina uma rotina que determine a transposta de uma matriz dada como argumento.
4. Defina uma rotina que a partir de uma matriz recebida como parâmetro, de dimensões n por
m preencha um vector com um número de células igual a n*m. A primeira linha da matriz será
Ana Madureira - 32 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
5. Defina uma rotina que determine a soma dos elementos de cada linha, de cada coluna e da
diagonal principal de uma matriz bidimensional recebida por parâmetro.
6.3.3. Strings
1. Escreva um programa para contar e imprimir o número de dígitos, vogais e consoantes lidas do
teclado.
2. Escreva uma função que, recebendo uma string como parâmetro, inverta essa mesma string.
Elabore um programa que permita testar a função.
3. A complexidade de uma palavra é dada pelo maior número de consoantes consecutivas nessa
mesma palavra (Exemplo: “complexidade” tem complexidade 3).
a) Escreva uma função que retorne a complexidade de uma palavra. A palavra é passada
como parâmetro sob a forma de uma string que contém apenas esta.
b) Utilizando a função anterior escreva um programa que, dada uma frase, mostre a
complexidade média da frase (média das complexidades das palavras que a constituem).
Ana Madureira - 33 -
Aplicações Informáticas de Gestão
Estruturas de Dados Estáticas
www.foresp.pt
7. Bibliografia
1. O Guia Prático do Visual Basic 2008, Vítor Pereira, ISBN: 978-989-615-067-9, Centro Atlântico, 2008
4. Textos de Apoio da disciplina Algoritmia e Programação, 2006/2007, Luiz faria, Engª Electroptércnica e de
Computadores – Sistema de Energia, ISEP.
5. An Introduction to Programming Using Visual Basic 2005, 6ª Edição, David I. Schneider, Prentice Hall
Ana Madureira - 34 -