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:
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.
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.
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.
' 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
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).
Início: 25/4/2008
Última modificação: 18:43 06-05-2008