Loops

Loops

Doggie Daddy


Índice das lições


Loop ou repetição são estruturas para voltar a executar um conjunto de expressões em condições diferentes até que seja atingida uma condição que encerre a repetição.

Alguns loops básicos

Assim como o Smalltalk não possui estruturas sintáticas para condicionais, que usam mensagens e blocos, também ocorre a mesma coisa com os loops que são implementado com mensagens, blocos e recursão.

Vamos abordar algumas formas:

  • timesRepeat:
  • to:do:
  • to:by:do:
  • whileTrue:
  • whileFalse:

As mensagens são como abaixo:

  • anInteger timesRepeat: block
  • aNumber to: anotherNumber do: block
  • aNumber to: aStopNumber by: aStepNumber do: block
  • aBlock whileTrue: anotherBlock
  • aBlock whileFalse: anotherBlock

timesRepeat loop

A mensagem timesRepeat: é enviada a um número inteiro, o que determina o número de vezes que o bloco, que é seu argumento, será avaliado.

Observe que o bloco não tem um argumento e perfaz a sua computação com base num contexto que o envolve e que mantém os valores mostrados no Transcript na variável x, que vai sendo incrementada a cada loop.
Na primeira linha no Playground está uma declaração de variável: | x |. Outro exemplo de declaração de variáveis é | x y z |. As variáveis devem ser declaradas antes do seu uso no Smalltalk. No Playground as variáveis são declaradas automaticamente e você não precisa se preocupar com isto. Mas se quiser declarar pode fazê-lo. Nós fizemos aqui para evitar algumas mensagens de advertência que apareceriam no Transcript se não o fizéssemos.
Execute os exemplos no Playground com Do it.

Abaixo um exemplo do loop do tipo timesRepeat.

to do loop

A mensagem to:do: é enviada a um número, que inclui inteiros mas também frações e números de ponto flutuante. O seu segundo argumento também é um número nesse sentido. O terceiro argumento é o bloco que vai ser repetidamente executado.

A partir do número passado como primeiro argumento o bloco vai recebendo como argumentos, a cada loop, este número e os subsequentes incrementados de 1 e saindo do loop quando algum número atinge um valor maior do que o segundo argumento.

Por exemplo: 1.5 to: 5.2 do: aBlock vai iterar o loop passando para o bloco 1.5, 2.5, 3.5 e, finalmente, 4.5.

Abaixo um exemplo do loop do tipo to do.

to by do loop

A mensagem to:by:do: é enviada a um número, que inclui inteiros mas também frações e números de ponto flutuante. Em relação ao loop anterior ela possui mais um argumento que representa o incremento entre os números passados ao bloco.

Por exemplo: O loop da expressão 2/3 to: 1.3 by: 1/4 do: block passa os seguintes números para o bloco a cada loop2/3, 11/12 e 7/6.

A expressão, usando a loop na modalidade anterior, 2.2 to: 5 do: block equivale a 2.2 to: 5 by: 1 do: block (o incremento de 1 é o default).

Abaixo um exemplo do loop do tipo to by do.

whileTrue loop

A mensagem whileTrue: é enviada a um bloco que a cada vez que for avaliado com true causa a execução do bloco que é seu argumento. Quando for avaliado pela primeira vez como false o loop termina sem que o bloco que é o seu argumento seja avaliado.

Este loop e o próximo são mais gerais e, diferentemente dos anteriores, não contém uma garantia de que não vá ser um loop infinito, isto é, uma repetição que nunca para, nunca termina a sua computação. Quando um loop infinito é encontrado o ambiente parece ter travado.
Dica: Para abortar um loop infinito ou tentar ter de novo o controle do ambiente de programação que aparenta estar num loop infinito use a combinação de teclas Cmd + . ou Ctrl + .

Abaixo um exemplo do loop do tipo whileTrue.

whileFalse loop

A mensagem whileFalse: é enviada a um bloco que a cada vez que for avaliado com false causa a execução do bloco que é seu argumento. Quando for avaliado pela primeira vez como true o loop termina sem que o bloco que é o seu argumento seja avaliado.

Abaixo um exemplo do loop do tipo whileFalse.

Estrutura de controle

Com esta lição você está de posse das três estruturas básicas de controle que permitem a computação de qualquer coisa que for computável.

A três estruturas são:

  • Sequência
  • Decisão
  • Repetição
Estruturas básicas de programação estruturada

Sequência

Uma sequência de expressões é executada de cima para baixo e da esquerda para a direita.

Exemplo:

5 factorial.
(Float pi / 4) tan. Date today.
DateAndTime now

Vai executar na seguinte ordem:


  1. 5 factorial
  2. (Float pi / 4) tan
  3. Date today
  4. DateAndTime now

Decisão

A decisão pode ter dois blocos alternativos, uma para uma avaliação true e outro para o false. Mas um dos blocos pode ser nulo ou omisso.

| x |
x := 41.
x < 42 ifTrue: [ 
    x := x + 1
]

Repetição

A repetição usa dois blocos. Uma para a condição de parada e outro para a execução repetida.

| x |
x := 0.
[ x < 42 ] whileTrue: [
    x := x + 1
]
| x |
x := 0.
[ x = 42 ] whileFalse: [
    x := x + 1
]

Encerrando

Encerre a lição e o ambiente salvando a imagem.



Report Page