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.

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 do loop

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.

to by do loop

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.

whileTrue loop

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.

whileFalse loop

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