• Nenhum resultado encontrado

O comando WHILE .. DO permite a repetição de um comando, ou bloco de comandos, um número finito ou indeterminado de vezes. O número de repetições é determinado por uma condição de controle que deve ser testada antes da execução do comando (ou bloco de comandos). {Sintaxe 1:} while condição do Comando; {Sintaxe 2:} while condição do begin Bloco de Comandos; end; {Sintaxe 1:}

for contador := fim downto início do Comando;

{Sintaxe 2:}

for contador := fim downto início do begin

Bloco de Comandos; end;

Note que o comando, ou bloco de comandos, só será executado se a condição for avaliada como verdadeira. Pode-se ler o comando como: ENQUANTO a condição for verdadeira, FAÇA: executar comando (ou bloco de comandos).

A principal característica do WHILE é efetuar um teste lógico no início de um loop (laço), verificando se é permitido executar o trecho de instruções abaixo dela. Desta forma, poderá executar um determinado conjunto de instruções enquanto a condição verificada permanecer verdadeira. No momento em que a condição se torna falsa, o processamento da rotina é desviado para fora do laço.

Sendo a condição falsa logo no início do laço, as instruções contidas nele são ignoradas. Usando o comando WHILE .. DO, vamos elaborar um programa para imprimir todos os números entre 1 e 10. Para isto, a condição será os números serem maiores que 0 e menores ou iguais a 10.

Usando o FOR, o programa seria como a Listagem 5.5

Listagem 5.5 – Listagem de números de 1 a 10

Note que o FOR controla implicitamente a condição, fazendo o i (controle) variar entre 1 e 10. Para fazer o mesmo com o WHILE, necessitamos de um código similar. Vamos iniciar uma variável de controle com 1 e fazê-la variar explicitamente de 1 em 1, até chegar a 10. Por exemplo, vejamos a Listagem 5.6

Listagem 5.6 – Listagem de números de 1 a 10

A linha 6 inicia a variável i com 1, pois desejam-se os números entre 1 e 10. Logo, ela tem de iniciar em 1.

Como o maior valor deve ser o 10, i terá de variar até 10. Isso deve ser garantido pela condição do WHILE, o que é feito na linha 7.

1 program whileSimples; 2 uses crt; 3 var i : integer; 4 5 begin 6 i := 1; 7 while (i <= 10) do 8 begin 9 writeln('valor de i: ', i); 10 i := i + 1; 11 end; 12 readkey; 13 end. 1 for i := 1 to 10 do 2 begin 3 writeln('valor de i: ', i); 4 end;

Tem-se, então, um laço de repetição de 10 vezes. Porém, isso só é verdade se i for incrementado de 1 em 1, como é feito na linha 10. Isso garante que i será um valor do conjunto {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Se a linha 10 fosse i := i + 5, i passaria de 1 para 6, por exemplo, não atendendo o que se deseja.

O código da Listagem 5.6 pode ser lido assim: inicie i em 1, faça i variar de 1 em 1 até 10 e, enquanto i for menor que 10, imprima seu valor.

Tudo que está entre o begin (linha 5) e o end (linha 13), que compõe um bloco de comandos, será repetido 10 vezes. Isso é garantido se o programador incrementar o valor de i de 1 em 1.

O fluxograma do programa da Listagem 5,6 é apresentado na Figura 5.AA Início ‘Valor de i: ‘ i = 1 i <= 10 SIM Fim NÃO i = i + 1 i

Figura 5.AA – While com Contador

Uma alteração interessante a este programa é o seguinte: imprimir todos os número pares entre 1 e 10. Apresentaremos duas soluções possíveis a este problema.

Na solução 1, exibida na Listagem 5.7, vamos iniciar uma variável de controle com 1 e fazê-la variar explicitamente de 1 em 1, até chegar a 10. Embora a solução seja similar a anterior, o bloco de comandos deve filtrar os elementos a exibir.

Listagem 5.7 – Listagem de números de 1 a 10

A principal alteração da Listagem 5.7 para a 5.6 está na adição da condicional na linha 9. Agora, um número só será impresso se ele for par, ou seja, o resto da divisão de i por 2 é zero (i mod 2 = 0), logo, i é divisível por 2.

O fluxograma desta solução é apresentado na Figura 5.BB

Início ‘Valor de i: ‘ i = 1 i <= 10 SIM Fim NÃO i = i + 1 Laço do While i i mod 2 = 0 SIM NÃO

Figura 5.BB – Pares entre 1 e 10 com WHILE

Na solução 2, exibida na Listagem 5.8, vamos usar um pouco de matemática. Como se desejam os números pares entre 1 e 10, sabe-se que o primeiro número válido é 2. Logo, pode-se iniciar a variável de controle i com 2.

1 program whilePares; 2 uses crt; 3 var i : integer; 4 5 begin 6 i := 1; 7 while (i <= 10) do 8 begin 9 if (i mod 2 = 0) then 10 writeln('valor de i: ', i); 11 i := i + 1; 12 end; 13 readkey; 14 end.

E, como se desejam apenas os pares, vamos variar explicitamente i de 2 em 2, até chegar a 10. Assim, teremos {2, 4, 6, 8, 10}. Vejamos a solução

Listagem 5.8 – Listagem de números de 1 a 10

A principal alteração da Listagem 5.7 para a 5.6 está no início da variável i e em seu incremento, agora de 2 em 2 (linha 10). Como i inicia em 2, teremos os valores {2, 4, 6, 8, 10}.

O fluxograma desta solução é apresentado na Figura 5.CC

Início ‘Valor de i: ‘ i = 2 i <= 10 SIM Fim NÃO i = i + 2 Laço do While i Figura 5.CC

Os exemplos apresentados até agora usaram o WHILE com laços finitos, pois havia uma condição de parada. Todavia, no seguinte problema, teremos um laço infinito (indeterminado): 1 program whilePares; 2 uses crt; 3 var i : integer; 4 5 begin 6 i := 2; 7 while (i <= 10) do 8 begin 9 writeln('valor de i: ', i); 10 i := i + 2; 11 end; 12 readkey; 13 end.

Início do Algoritmo WhileQuadrado

1. Solicitar ao usuário para digitar um número. 2. Enquanto o número digitado não for zero, faça:

a. imprimir o quadrado do número;

b. solicitar ao usuário para digitar um número. Fim do Algoritmo WhileQuadrado

Quando o algoritmo WhileQuadrado chegará ao fim? Isso é indeterminado, pois não se sabe quando o usuário digitará o número 0.

O fluxograma deste algoritmo está na Figura 5.DD

Início i <> 0 SIM Fim NÃO Laço do While i * i i i Figura 5.DD – While

O código deste algoritmo está na Listagem 5.9

Listagem 5.9 – While 1 program whileQuadrados; 2 uses crt; 3 var i : integer; 4 5 begin

6 writeln('Digite um valor. 0 para terminar.');

7 readln(i);

8

9 while (i <> 0) do 10 begin

11 writeln('O quadrado de : ', i, ' eh: ', i * i);

12

13 writeln(#10, #10, #13, 'Digite um valor. 0 para terminar.');

14 readln(i);

15 end;

16 readkey;

No código da Listagem 5.9, a linha 6 imprime uma mensagem e a 7 lê um valor para i. A linha 9 inicia um laço que se repetirá enquanto i for diferente de 0 (i <> 0).

Se o usuário iniciar digitando 0, a condição da linha 9 faz com que o laço não seja executado.

A linha 11 imprime o quadrado do número lido e a 13 solicita outro valor. Destaca-se o uso de #10 (nova linha) e #13 (retorno de cursor) para criar duas linhas em branco e posicionar o cursor na coluna da esquerda, na tela.

A linha 14 lê um novo valor para i. Note que enquanto i for diferente de 0, o bloco de comando entre as linhas 10 e 15 se repetirá. Isso é um laço infinito.

Desafios

1. Imprimir todos os múltiplos de 5 entre 1 e 100 usando WHILE e sem usar IF ou Case.

2. Imprimir todos os múltiplos de 3 e 5 entre 1 e 100 usando WHILE e sem usar IF ou Case.

3. Imprimir todos os múltiplos de 3 ou 5 entre 1 e 100 usando WHILE e sem usar IF ou Case.

Documentos relacionados