Os ciclos while

De GNU Octave
Ir para: navegação, pesquisa

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)