[Índice Acima]

Controlo do fluxo do programa

Ciclos

Outros tipos de estruturas de controlo são os ciclos, que repetem um bloco de código enquanto uma condição é verdadeira. Há três tipos básicos de ciclo:

Os ciclos do..loop while e do..loop until

Depois desta conversa toda, temos uma variante, o ciclo DO..LOOP WHILE do WSH. Este ciclo tem o teste no fim, e é repetido enquanto se verificar uma condição:

	do
		ins1
		ins2
		...
		insN
	loop while <teste>

O WSH tem também um ciclo DO..LOOP UNTIL, que é a implementação do ciclo REPEAT..UNTIL, que é repetido até que a condição do teste se verifique.

Exemplo

Já não lhe vou dizer o que faz o programa, porque já o sabe ler. Note que acrescentei uns divertimentos gráficos (vbExclamation).


' Programa jose3.vbs 15:37 26-04-2008
' Aceita um nome e afixa-o
' Verifica previamente a entrada e insiste

' Exemplo de construção do..while


' Criamos uma variável
dim Nome

' ----------------------------------------
' Pedir a entrada
' enquanto nada decente for introduzido

do

   ' Limpar o lixo recebido na variavel 
   ' depois de uma passagem pelo ciclo
     Nome=""

   ' Pedimos o valor e atribuimo-lo à variável
     Nome= inputbox ("Como se chama?")

   ' Se nada for introduzido damos uma mensagem de erro
     if Nome="" then msgbox "Tem de" & _
	" introduzir alguma coisa" &_
	" ou '0' para terminar",_
        vbExclamation, "Huh-oh"

   ' Se o nome é José, indicar ser inválido
     if Nome="José" then msgbox Nome &_ 
        " não é um nome válido.",_
        vbExclamation, "Huh-oh"

loop while((Nome="" and Nome <>"0") or Nome = "José")
'(Usando /loop until../, o resultado do teste é negado)

' ------------------------------------------
' Se algo que não 0 for introduzido, cumprimentar
if Nome <> "0" then
   msgbox "Olá, " & Nome & "!"
end if

' FIM DO PROGRAMA

O teste lógico na linha do loop while é relativamente contra-intuitivo. É frequente, quando há três ou mais termos, ser necessário usar tabelas de verdade (truth table) e conhecer as Leis de De Morgan.

Exercício

Faça um script que incremente uma variável com um incremento pedido ao utilizador, e devolva o valor que assumiu quando se tornou, em valor absoluto, maior que três. Atenção: se programar sem cuidado, pode lançar o programa num ciclo infinito.

Exemplo de solução

' Sem comentários 17:34 26-04-2008

dim contador, incremento

' Atribuição múltipla como inicialização
contador = incremento = 0

incremento= inputbox ("Qual o incremento?")

do
   contador = contador + incremento
loop until (contador > 3.0 or contador < -3.0)

msgbox "Resultado = " & contador

Erro de arredondamento

Esta solução tem a particularidade de, se o incremento for, em módulo, de 0,1 ou 0,2, dar 3 como resultado, o que é um erro.

Este erro é devido a erros acumulados de arredondamento e ainda mais um erro na comparação. Algumas implementações de linguagens são mais atreitas a estes erros que outras. O WSH, enquanto simples linguagem de script, não é orientado para implementações de cálculo numérico e muito provavelmente origina problemas de arredondamento se nos afastarmos dos tipos inteiro ou literal.

Substituindo, nas comparações, 3.0 por 3.000001 OU 2,999999 ou semelhante, isto é, considerando uma margem de erro para a comparação.

Isto é frequente em cálculo numérico automático, uma vez que os números são representados com uma quantidade finita de algarismos e, por exemplo, 1/3 poderá será calculado como 0,333333 e não mais; pelo que, somando três vezes 1/3, pode não se obter 1,0. (Como disse, isso depende da implementação da linguagem).

 

Índice | Comente


Início: 25/4/2008

Última modificação: 18:43 06-05-2008