Os ciclos while
A estrutura cíclica while é uma alternativa à estrutura do until. Ambas definem ciclos que se repetem de acordo com uma dada condição.
O ciclo while é executado repetidamente enquanto a condição for verdadeira. A condição escreve-se da mesma forma que se usa na instrução if. O ciclo pode não chegar a ser executado se a condição for logo falsa. Esta é a diferença para os ciclos do until.
Vamos exemplificar. Dado um número, pretende-se saber quantas vezes se pode dividir o mesmo por 2 até ser igual ou menor a 1. Por exemplo, dado o número 17, podemos ir dividindo o mesmo por 2, desta forma:
| divisão inteira | resultado | número de vezes |
|---|---|---|
| 17 / 2 | 8 | 1 |
| 8 / 2 | 4 | 2 |
| 4 / 2 | 2 | 3 |
| 2 / 2 | 1 | 4 |
Como não sabemos à priori o número que nos vai ser dado, não sabemos quantas vezes vamos ter que dividir o número por 2. Uma primeira abordagem seria:
numero = input("Indique um numero: "); while (numero > 1) numero = idivide(numero, 2) endwhile
O resultado da execução deste ciclo seria, para o número 13:
>> contardivisoespordois Indique um numero: 13 numero = 6 numero = 3 numero = 1 >>
O feedback do programa já nos ajuda a perceber que foi preciso dividir o número 3 vezes por 2 até termos um número 1 ou inferior a 1. Mas ainda não apresenta o resultado pretendido.
Melhorando um pouco o programa, podemos escrever:
numero = input("Indique um numero: "); contador = 0; while (numero > 1) numero = idivide(numero, 2); contador = contador + 1; endwhile disp(contador);
Os ciclos infinitos
Quando se usam ciclos, existe sempre o perigo de se escrever um que não termine. Se isso acontecer, o Octave continua indefinidamente a executá-lo. Para terminar a execução nestes casos, use o Crtl+C se estiver a usar a linha de comandos. O Octave UPM tem um botão próprio para terminar a execução de ciclos infinitos.
Exemplo muito simples de um ciclo infinito:
i = 1; while (i <= 20) disp(i) endwhile
Porque é um ciclo infinito? Porque a variável i tem sempre o valor 1. Não está a ser devidamente incrementada, como deveria, para poder chegar até 20.
Exercício
Use um ciclo while para garantir que o utilizador fornece um valor entre 6 e 23.
valor = input ('Indique um numero entre 6 e 23 (6-23): '); while ( valor < 6 | valor > 23) fprintf('Valor incorreto. Tente de novo.\n'); valor = input ('Indique um numero entre 6 e 23 (6-23): '); endwhile
Como estamos a usar um ciclo while, o mesmo pode nem sequer chegar a ser executado.
Exercício
O Octave já tem uma função que nos calcula o máximo divisor comum, designada gcd. No entanto, vamos escrever uma nova função baseada no Algortimo de Euclides.
Veja na animação disponível na Wikipédia que o algoritmo consiste em subtrair ao maior o menor, e assim sucessivamente, até que ambos sejam iguais.
Primeira versão:
a = 252 b = 105 while (a!=b) if (a>b) a=a-b else b=b-a endif endwhile disp(a)
Execução
>>> euclides a = 252 b = 105 a = 147 a = 42 b = 63 b = 21 a = 21 21 >>>
Programa completo:
a = input('a?'); b = input('b?'); while (a!=b) if (a>b) a=a-b; else b=b-a; endif endwhile disp(a)